gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:06:32 25 4
gpt4 key购买 nike

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

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 中; pair<unique_ptr, unique_ptr> 也可以;但不是对 <path, unique_ptr> : Why?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20583591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com