nothrow_move_constructible
全部标签 今天在重构一些代码以更改指向std::unique_ptr的原始指针时,我遇到了由于orderofevaluation导致的段错误错误。旧代码做了如下的事情:voidadd(conststd::string&name,Foo*f){_foo_map[name]=f;}voidprocess(Foo*f){add(f->name,f);}第一次天真地重构代码以使用std::unique_ptr:voidadd(conststd::string&name,std::unique_ptrf){_foo_map[name]=std::move(f);}voidprocess(std::uniq
类型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的正确行为,有没有办法检测到复制结构是不正确的?好吧,不仅仅是让它无法编译。 最佳答案
这个程序:#includestructT{T(){}T(constT&){std::coutT{returnt;})({});std::coutT{returnvoid(),t;})({});std::coutT{returnvoid(),std::move(t);})({});std::cout当由gcc-4.7.1编译时输出(link):moveconstructorcopyconstructormoveconstructor为什么逗号操作符会有这种效果?标准说:5.18Commaoperator[expr.comma]1-[...]Thetypeandvalueoftheresu
这个程序:#includestructT{T(){}T(constT&){std::coutT{returnt;})({});std::coutT{returnvoid(),t;})({});std::coutT{returnvoid(),std::move(t);})({});std::cout当由gcc-4.7.1编译时输出(link):moveconstructorcopyconstructormoveconstructor为什么逗号操作符会有这种效果?标准说:5.18Commaoperator[expr.comma]1-[...]Thetypeandvalueoftheresu
是std::move以下代码段中是否需要?std::functionmy_std_function;voidcall(std::function&&other_function){my_std_function.swap(std::move(other_function));}据我所知call()接受右值引用..但由于右值引用本身就是一个左值,为了调用swap(std::function&&)我必须使用std::move将其重新转换为右值引用我的推理是正确的还是std::move在这种情况下可以省略(如果可以,为什么?) 最佳答案
是std::move以下代码段中是否需要?std::functionmy_std_function;voidcall(std::function&&other_function){my_std_function.swap(std::move(other_function));}据我所知call()接受右值引用..但由于右值引用本身就是一个左值,为了调用swap(std::function&&)我必须使用std::move将其重新转换为右值引用我的推理是正确的还是std::move在这种情况下可以省略(如果可以,为什么?) 最佳答案
C++的new有一个选项可以在分配失败时返回空指针而不是抛出bad_alloc异常。Foo*pf=new(std::nothrow)Foo(1,2,3);(是的,我知道这只会阻止new抛出bad_alloc;它不会阻止Foo的构造函数抛出异常。)如果您想使用共享指针而不是原始指针,您通常应该使用make_shared,因为它可以巧妙地分配控制block。autopf=std::make_shared(1,2,3);make_shared封装了新版本,这使得(?)无法选择nothrow版本。因此,您似乎必须放弃make_shared并明确调用new。std::shared_ptrpf(n
C++的new有一个选项可以在分配失败时返回空指针而不是抛出bad_alloc异常。Foo*pf=new(std::nothrow)Foo(1,2,3);(是的,我知道这只会阻止new抛出bad_alloc;它不会阻止Foo的构造函数抛出异常。)如果您想使用共享指针而不是原始指针,您通常应该使用make_shared,因为它可以巧妙地分配控制block。autopf=std::make_shared(1,2,3);make_shared封装了新版本,这使得(?)无法选择nothrow版本。因此,您似乎必须放弃make_shared并明确调用new。std::shared_ptrpf(n
在页面Howto:WriteaMoveConstructorMicrosoft有一个关于如何编写移动构造函数的示例。它本质上是这样的:MyClass::MyClass(MyClass&&lhs){*this=std::move(lhs);}我已经尝试过了,这里确实需要std::move,但为什么呢?我认为move所做的唯一一件事就是转换为T&&。但是lhs已经是MyClass&&类型了,不是吗? 最佳答案 Namedrvaluereferencesarelvalues.Unnamedrvaluereferencesarervalue