Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 仅叮当声:一对可以放置到向量中;一对也可以;但不是配对:为什么?_C++_C++11_Vector_Compiler Errors_Clang - Fatal编程技术网

C++ 仅叮当声:一对可以放置到向量中;一对也可以;但不是配对:为什么?

C++ 仅叮当声:一对可以放置到向量中;一对也可以;但不是配对:为什么?,c++,c++11,vector,compiler-errors,clang,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(du

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

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的编译器错误:

错误:调用“std::_1::unique_ptr”的隐式删除副本构造函数,显然是引用对中的第二个成员unique_ptr

似乎出于某种原因,指示的失败案例导致调用该对的复制构造函数,而不是移动构造函数

这是OSX10.8.5上的Clang5.0.2。和VS 11.0.60610.01在Windows 7 64位上更新3

在我的实际应用程序中,数据类型更复杂,但错误归结为本问题中描述的错误

我的问题有两个:为什么指示的案例在Clang上失败,而其他两个案例(涵盖两种数据类型)成功了


然而,也许更重要的是:我能做些什么来解决这个问题?因为我的实际应用程序更复杂,所以我没有选择不在向量中执行定位或给定对的等价物-但是如果有任何其他方法可以克服这个问题,将该对放入向量中,我将非常高兴。

问题来自libc++标准库,因为它内部的成对构造函数要少得多

即libstd++具有以下构造函数:

template<class _U2, class = typename
       enable_if<is_convertible<_U2, _T2>::value>::type>
constexpr pair(const _T1& __x, _U2&& __y)
: first(__x), second(std::forward<_U2>(__y)) { }
它允许在Linux上使用clang++编译示例。但libc++只有:

pair(const pair&) = default;
pair(pair&&) = default;
constexpr pair();
pair(const T1& x, const T2& y);                          // constexpr in C++14
template <class U, class V> pair(U&& x, V&& y);          // constexpr in C++14
template <class U, class V> pair(const pair<U, V>& p);   // constexpr in C++14
template <class U, class V> pair(pair<U, V>&& p);        // constexpr in C++14
template <class... Args1, class... Args2>
    pair(piecewise_construct_t, tuple<Args1...> first_args,
         tuple<Args2...> second_args);
我猜,成对约束T1&x,常数T2&y;由于第一个参数是非右值引用而应用

核心解决方案是手动将此构造函数放置在系统库中。
该对在实用程序文件中定义。如果您希望能够在其他地方编译代码,可以将修改后的libc++捆绑到您的项目中,这真的不是什么大问题。

问题来自libc++标准库,因为其中的成对构造函数要少得多

即libstd++具有以下构造函数:

template<class _U2, class = typename
       enable_if<is_convertible<_U2, _T2>::value>::type>
constexpr pair(const _T1& __x, _U2&& __y)
: first(__x), second(std::forward<_U2>(__y)) { }
它允许在Linux上使用clang++编译示例。但libc++只有:

pair(const pair&) = default;
pair(pair&&) = default;
constexpr pair();
pair(const T1& x, const T2& y);                          // constexpr in C++14
template <class U, class V> pair(U&& x, V&& y);          // constexpr in C++14
template <class U, class V> pair(const pair<U, V>& p);   // constexpr in C++14
template <class U, class V> pair(pair<U, V>&& p);        // constexpr in C++14
template <class... Args1, class... Args2>
    pair(piecewise_construct_t, tuple<Args1...> first_args,
         tuple<Args2...> second_args);
我猜,成对约束T1&x,常数T2&y;由于第一个参数是非右值引用而应用

核心解决方案是手动将此构造函数放置在系统库中。
该对在实用程序文件中定义。如果您想在其他地方编译代码,您可以将修改后的libc++捆绑到您的项目中,这真的不是什么大问题。

这是libc++中的一个bug,对不起。它被固定在行李箱的顶端。我相信您可以通过在compile命令中添加以下内容来解决此问题:

-D_LIBCPP_TRIVIAL_PAIR_COPY_CTOR

这是libc++中的一个bug,对不起。它被固定在行李箱的顶端。我相信您可以通过在compile命令中添加以下内容来解决此问题:

-D_LIBCPP_TRIVIAL_PAIR_COPY_CTOR

myvec.emplace\u backsd::movedummy\u路径,唯一\u ptrnew int12;工作?@jrok-我试过了,本来会包括在问题中,但我想让问题尽可能简单。答案是:没有。添加std::沿路径移动、唯一的\u ptr或两者都失败。编译的叮当版本很好。@jrok-这是有希望的。也许它是一个编译器标志。我将开始挖掘。@ JROK,在下面的编译器标志中,问题出现了:-XC++(C++-ARCH)X86Y64—STD=GNU+11—STDLIB=LBB++。请参见myvec.emplace\u backsd::movedummy\u路径,unique\u ptrnew int12;工作?@jrok-我试过了,本来会包括在问题中,但我想让问题尽可能简单。答案是:没有。添加std::沿路径移动、唯一的\u ptr或两者都失败。编译的叮当版本很好。@jrok-这是有希望的。也许它是一个编译器标志。我将开始挖掘。@ JROK,在下面的编译器标志中,问题出现了:-XC++(C++-ARCH)X86Y64—STD=GNU+11—STDLIB=LBB++。再见,谢谢。问题是,在Xcode中设置什么设置来生成示例代码?在过去的一个小时里,我没有尝试任何组合。非常感谢。如果您能提到将修改后的libc++捆绑到项目中的第一步或第二步,我将不胜感激。我在Windows上的经验要丰富得多。@DanNissenbaum我不熟悉XCode,但你可以从这个页面开始:获取它并参与其中该库由一个命令构建。然后,您只需要在XCode项目中正确设置编译标志,以便与您的库挂钩,而不是与系统库挂钩。@DanNissenbaum事实上,您自己的STL库及其构建是另一个问题的重点,因此:我很抱歉不接受您的答案,特别是因为您将其隔离为一个libc++错误。然而,我确实向libc++项目提交了一份bug报告,当libc++项目的howardhinnant在两个小时内解决了这个问题时,我被接受谁的答案所困扰。我希望两样都能接受,我

感谢您隔离此错误。最后,我觉得霍华德在图书馆里的快速修复方案本身就是公认的答案。再次感谢!谢谢问题是,在Xcode中设置什么设置来生成示例代码?在过去的一个小时里,我没有尝试任何组合。非常感谢。如果您能提到将修改后的libc++捆绑到项目中的第一步或第二步,我将不胜感激。我在Windows上的经验要丰富得多。@DanNissenbaum我不熟悉XCode,但你可以从这个页面开始:获取它并参与其中该库由一个命令构建。然后,您只需要在XCode项目中正确设置编译标志,以便与您的库挂钩,而不是与系统库挂钩。@DanNissenbaum事实上,您自己的STL库及其构建是另一个问题的重点,因此:我很抱歉不接受您的答案,特别是因为您将其隔离为一个libc++错误。然而,我确实向libc++项目提交了一份bug报告,当libc++项目的howardhinnant在两个小时内解决了这个问题时,我被接受谁的答案所困扰。我希望我能接受这两个,我感谢你隔离了这个bug。最后,我觉得霍华德在图书馆里的快速修复方案本身就是公认的答案。再次感谢!说到快速响应-问题在报告后2小时内解决。恭喜,谢谢。这是错误报告的链接。对任何感兴趣的人来说。我的话模棱两可。它已经被固定在树干的顶端。我希望我建议的解决方法对您有效。不幸的是,这里的预处理器标志似乎不起作用。在执行完全清理以删除任何缓存的预处理文件,并尝试使用以下观察到的相关命令行编译有问题的文件后:clang++-c-pipe-std=c++11-stdlib=libc++-D_LIBCPP_-triple_-COPY_-CTOR-g-gdwarf-2-isysroot-std=c++11-stdlib libc++yes,其中两个标志重复-很遗憾,报告了相同的错误。那么恐怕您唯一的其他选择是签出主干libc++的提示,并将-nostdinc++-I/include放在命令行上。这将不需要重建动态库。说到快速响应,该问题在报告后2小时内修复。恭喜,谢谢。这是错误报告的链接。对任何感兴趣的人来说。我的话模棱两可。它已经被固定在树干的顶端。我希望我建议的解决方法对您有效。不幸的是,这里的预处理器标志似乎不起作用。在执行完全清理以删除任何缓存的预处理文件,并尝试使用以下观察到的相关命令行编译有问题的文件后:clang++-c-pipe-std=c++11-stdlib=libc++-D_LIBCPP_-triple_-COPY_-CTOR-g-gdwarf-2-isysroot-std=c++11-stdlib libc++yes,其中两个标志重复-很遗憾,报告了相同的错误。那么恐怕您唯一的其他选择是签出主干libc++的提示,并将-nostdinc++-I/include放在命令行上。这不需要重建动态库。