- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有以下三个代码片段来演示一个容易重现的问题。
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/
我是一名优秀的程序员,十分优秀!