【发布时间】:2014-01-02 05:32:02
【问题描述】:
我有以下三个 sn-ps 代码来演示一个易于重现的问题。
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。 (以及 VS 11.0.60610.01 Update 3 在 Windows 7 64 位上。)
在我的实际应用中,数据类型更复杂,但错误归结为这个问题中描述的错误。
我的问题是双重的:为什么指示的案例在 Clang 上失败,即使涵盖两种数据类型的其他两个案例成功了?
然而,也许更重要的是:我可以做些什么来解决这个问题?因为我的实际应用程序更复杂,所以我无法选择不执行 emplace(或类似的操作)将给定对放入向量中 - 但如果有任何其他方法可以解决这个 Clang 问题以将该对放入该向量中,我会非常高兴。
【问题讨论】:
-
myvec.emplace_back(std::move(dummy_path), unique_ptr<int>(new int(12)));工作吗? -
@jrok - 我试过了(并且会包含在问题中,但希望问题尽可能简单)。答案:不。在
path、unique_ptr或两者周围添加std::move(),仍然失败。 -
Coliru 的 Clang 版本编译良好。
-
@jrok - 这是有希望的。也许它是一个编译器标志。我要开始挖了。
-
@jrok 有了以下编译器标志,问题就出现了:
-x c++ -arch x86_64 -std=gnu++11 -stdlib=libc++。见coliru.stacked-crooked.com/a/5b90bf49e93c6535
标签: c++ c++11 vector compiler-errors clang