c++ - Clang 只有 : A pair<path, path> 可以被放置到一个 vector 中;一对 <unique_ptr, unique_ptr> 也可以;但不是对 <path, unique_ptr> : Why?

标签 c++ c++11 vector compiler-errors clang

我有以下三个代码片段来演示一个易于重现的问题。

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/

相关文章:

c++ - 读取文件头

c++ - 为几个可能的参数(类型名)专门化类

c++ - 有什么正当理由不使用公共(public)虚拟方法吗?

c++ - obj vector 到成员函数

arrays - 具有 max(abs(x),abs(y)) 的元素 x(i) 或 y(i) 的 MATLAB 向量

c++ - 是否可以在给定基数的 MSVC/VC++ 中分配内存?

c++ - 如何在shell脚本中调用c++程序

c++查找 vector 中元素的实际数量

c++ - 多种类型的模板方法特化

c++ - 在不修改底层二进制文件的情况下将 C++ 类型 int16_t 转换为 int64_t