我有以下三个代码片段来演示一个易于重现的问题。
using namespace boost::filesystem;
using namespace std;
int main()
{
path dummy_path;
// Snippet 1
// Two paths
// Succeeds
//
// vector<pair<path, path>> myvec;
// myvec.emplace_back(dummy_path, dummy_path);
// Snippet 2
// Two unique_ptr's
// Succeeds
//
// vector<pair<unique_ptr<int>, unique_ptr<int>>> myvec;
// myvec.emplace_back(unique_ptr<int>(new int(13)), unique_ptr<int>(new int(12)));
// Snippet 3
// A path and a unique_ptr.
//
// **FAILS** on Clang, succeeds in Visual Studio
//
vector<pair<path, unique_ptr<int>>> myvec;
myvec.emplace_back(dummy_path, unique_ptr<int>(new int(12)));
}
这是 Clang 上的编译器错误:
error: call to implicitly-deleted copy constructor of 'std::__1::unique_ptr<int, std::__1::default_delete<int> >'
(显然是指该对中的第二个成员 unique_ptr
)。
似乎由于某种原因,指示的失败情况导致调用该对的复制构造函数,而不是移动构造函数。
这是 OS X 10.8.5 上的 Clang 5.0.2。 (以及 Windows 7 64 位上的 VS 11.0.60610.01 Update 3。)
在我的实际应用程序中,数据类型更复杂,但错误归结为这个问题中描述的错误。
我的问题是双重的:为什么指示的情况在 Clang 上失败,即使涵盖两种数据类型的其他两种情况都成功了?
也许更重要的是:我能做些什么来解决这个问题?因为我的实际应用程序更复杂,所以我没有不执行 emplace (或类似操作)的选项给定的对放入 vector 中 - 但如果有任何其他方法我可以解决这个 Clang 问题以将该对放入该 vector 中,我会非常高兴。
最佳答案
这是 libc++ 中的一个错误,抱歉。它已固定在树干顶端。我相信您可以通过在编译命令中添加以下内容来解决这个问题:
-D_LIBCPP_TRIVIAL_PAIR_COPY_CTOR
关于c++ - Clang 只有 : A pair<path, path> 可以被放置到一个 vector 中;一对 <unique_ptr, unique_ptr> 也可以;但不是对 <path, unique_ptr> : Why?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20583591/