我有一个unique_ptr的vector,我想将它们附加到另一个unique_ptrvector。我通常会做一个简单的插入:std::vector>bar;bar.push_back(std::unique_ptr(newfoo(1)));std::vector>baz;baz.push_back(std::unique_ptr(newfoo(2)));bar.insert(bar.end(),baz.begin(),baz.end());但是这给了我类似这样的编译错误:/usr/include/c++/4.8/bits/stl_algobase.h:335:error:useofd
我有一个unique_ptr的vector,我想将它们附加到另一个unique_ptrvector。我通常会做一个简单的插入:std::vector>bar;bar.push_back(std::unique_ptr(newfoo(1)));std::vector>baz;baz.push_back(std::unique_ptr(newfoo(2)));bar.insert(bar.end(),baz.begin(),baz.end());但是这给了我类似这样的编译错误:/usr/include/c++/4.8/bits/stl_algobase.h:335:error:useofd
代码:#includeusingnamespacestd;structT{};T*foo(){returnnewT;}Tconst*bar(){returnfoo();}intmain(){unique_ptrp1(bar());//OKunique_ptra1(bar());//OKunique_ptrp2(foo());//OKunique_ptra2(foo());//?thisisline#15}VisualC++10.0和MinGWg++4.4.1的示例错误:[d:\dev\test]>clfoo.cppfoo.cppfoo.cpp(15):errorC2248:'std::
代码:#includeusingnamespacestd;structT{};T*foo(){returnnewT;}Tconst*bar(){returnfoo();}intmain(){unique_ptrp1(bar());//OKunique_ptra1(bar());//OKunique_ptrp2(foo());//OKunique_ptra2(foo());//?thisisline#15}VisualC++10.0和MinGWg++4.4.1的示例错误:[d:\dev\test]>clfoo.cppfoo.cppfoo.cpp(15):errorC2248:'std::
类型trait是否应该能够处理std::vector>之类的情况?并检测到它不是可复制的?这是https://ideone.com/gbcRUa的示例(运行g++4.8.1)#include#include#include#includeintmain(){//Thisprints1,implyingthatit'scopyconstructible,whenit'sclearlynotstd::cout>>::value如果这是is_copy_constructible的正确行为,有没有办法检测到复制结构是不正确的?好吧,不仅仅是让它无法编译。 最佳答案
类型trait是否应该能够处理std::vector>之类的情况?并检测到它不是可复制的?这是https://ideone.com/gbcRUa的示例(运行g++4.8.1)#include#include#include#includeintmain(){//Thisprints1,implyingthatit'scopyconstructible,whenit'sclearlynotstd::cout>>::value如果这是is_copy_constructible的正确行为,有没有办法检测到复制结构是不正确的?好吧,不仅仅是让它无法编译。 最佳答案
澄清一下,使用make_unique仅在表达式中有多个分配时才增加异常安全性,而不仅仅是一个,对吗?例如voidf(T*);f(newT);是完全异常安全的(就分配和东西而言),而voidf(T*,T*);f(newT,newT);不是,对吗? 最佳答案 不仅当你有多个分配时,而且当你可以在不同的地方throw时。考虑一下:f(make_unique(),function_that_can_throw());对比:f(unique_ptr(newT),function_that_can_throw());第二种情况,允许编译器调用(
澄清一下,使用make_unique仅在表达式中有多个分配时才增加异常安全性,而不仅仅是一个,对吗?例如voidf(T*);f(newT);是完全异常安全的(就分配和东西而言),而voidf(T*,T*);f(newT,newT);不是,对吗? 最佳答案 不仅当你有多个分配时,而且当你可以在不同的地方throw时。考虑一下:f(make_unique(),function_that_can_throw());对比:f(unique_ptr(newT),function_that_can_throw());第二种情况,允许编译器调用(
假设我有以下类层次结构:structBase{};structDerived:publicBase{voidDoStuffSpecificToDerivedClass(){}};还有以下工厂方法:std::unique_ptrfactoryMethod(){autoderived=std::make_unique();derived->DoStuffSpecificToDerivedClass();returnderived;//doesnotcompile}问题是,return语句无法编译,因为std::unique_ptr没有支持协方差的复制构造函数(这是有道理的,因为它没有有任何
假设我有以下类层次结构:structBase{};structDerived:publicBase{voidDoStuffSpecificToDerivedClass(){}};还有以下工厂方法:std::unique_ptrfactoryMethod(){autoderived=std::make_unique();derived->DoStuffSpecificToDerivedClass();returnderived;//doesnotcompile}问题是,return语句无法编译,因为std::unique_ptr没有支持协方差的复制构造函数(这是有道理的,因为它没有有任何