草庐IT

c++ - 自动生成 move 操作的规则是什么?

在C++98中,C++编译器可以自动通过成员复制生成复制构造函数和复制赋值运算符,例如structX{std::strings;std::vectorv;intn;};编译器自动为X生成复制构造函数和复制赋值运算符,使用成员复制。但是C++11中的move语义如何改变?是moveconstructor和move赋值运算符自动生成,比如复制构造函数和复制赋值运算符?是否存在move操作不自动生成的情况? 最佳答案 NikosAthanasiou给出了一个很好的答案,但我想添加这个我认为非常有用的工具。这是HowardHinnant演讲

c++ - move 的 vector 总是空的吗?

我知道通常标准对已从以下位置move的值几乎没有要求:N348517.6.5.15[lib.types.movedfrom]/1:ObjectsoftypesdefinedintheC++standardlibrarymaybemovedfrom(12.8).Moveoperationsmaybeexplicitlyspecifiedorimplicitlygenerated.Unlessotherwisespecified,suchmoved-fromobjectsshallbeplacedinavalidbutunspecifiedstate.我找不到关于vector的任何信息明确

c++ - move 的 vector 总是空的吗?

我知道通常标准对已从以下位置move的值几乎没有要求:N348517.6.5.15[lib.types.movedfrom]/1:ObjectsoftypesdefinedintheC++standardlibrarymaybemovedfrom(12.8).Moveoperationsmaybeexplicitlyspecifiedorimplicitlygenerated.Unlessotherwisespecified,suchmoved-fromobjectsshallbeplacedinavalidbutunspecifiedstate.我找不到关于vector的任何信息明确

c++ - 引用重载,而不是唯一的按值传递+ std::move?

似乎有关C++0x右值的主要建议是将move构造函数和move运算符添加到您的类中,直到编译器默认实现它们。但是,如果您使用VC10,等待是一种失败的策略,因为自动生成可能要到VC10SP1,或者在最坏的情况下,VC11才会出现。很可能,等待的时间会以年为单位。这就是我的问题。编写所有这些重复的代码并不好玩。而且看着很不爽。但对于那些被认为速度较慢的类(class)来说,这是一个很受欢迎的负担。对于数百甚至数千个较小的类(class)来说,情况并非如此。::sighs::C++0x应该让我写less代码,而不是更多!然后我有了一个想法。我猜是很多人分享的。为什么不按值传递所有内容?st

c++ - 引用重载,而不是唯一的按值传递+ std::move?

似乎有关C++0x右值的主要建议是将move构造函数和move运算符添加到您的类中,直到编译器默认实现它们。但是,如果您使用VC10,等待是一种失败的策略,因为自动生成可能要到VC10SP1,或者在最坏的情况下,VC11才会出现。很可能,等待的时间会以年为单位。这就是我的问题。编写所有这些重复的代码并不好玩。而且看着很不爽。但对于那些被认为速度较慢的类(class)来说,这是一个很受欢迎的负担。对于数百甚至数千个较小的类(class)来说,情况并非如此。::sighs::C++0x应该让我写less代码,而不是更多!然后我有了一个想法。我猜是很多人分享的。为什么不按值传递所有内容?st

c++ - 从函数返回值时使用 std::move() 以避免复制

考虑一个支持默认移动语义的类型T。还要考虑下面的函数:Tf(){Tt;returnt;}To=f();在旧的C++03中,一些非最优编译器可能会调用复制构造函数两次,一次用于“返回对象”,一次用于o。在c++11中,由于f()里面的t是一个左值,那些编译器可能会像以前一样调用一次拷贝构造函数,然后调用moveo的构造函数。声明避免第一次“额外复制”的唯一方法是返回时移动t是否正确?Tf(){Tt;returnstd::move(t);} 最佳答案 没有。每当return中的局部变量语句符合复制省略的条件,它绑定(bind)到右值引用

c++ - 从函数返回值时使用 std::move() 以避免复制

考虑一个支持默认移动语义的类型T。还要考虑下面的函数:Tf(){Tt;returnt;}To=f();在旧的C++03中,一些非最优编译器可能会调用复制构造函数两次,一次用于“返回对象”,一次用于o。在c++11中,由于f()里面的t是一个左值,那些编译器可能会像以前一样调用一次拷贝构造函数,然后调用moveo的构造函数。声明避免第一次“额外复制”的唯一方法是返回时移动t是否正确?Tf(){Tt;returnstd::move(t);} 最佳答案 没有。每当return中的局部变量语句符合复制省略的条件,它绑定(bind)到右值引用

c++ - std::forward 与 std::move 的用法

我总是读到std::forward仅用于模板参数。然而,我在问自己为什么。请参阅以下示例:voidImageView::setImage(constImage&image){_image=image;}voidImageView::setImage(Image&&image){_image=std::move(image);}这是两个基本相同的功能;一个采用左值引用,另一个采用右值引用。现在,我想既然std::forward应该返回一个左值引用,如果参数是一个左值引用和一个右值引用,如果参数是一个,这个代码可能是简化成这样:voidImageView::setImage(Image&&

c++ - std::forward 与 std::move 的用法

我总是读到std::forward仅用于模板参数。然而,我在问自己为什么。请参阅以下示例:voidImageView::setImage(constImage&image){_image=image;}voidImageView::setImage(Image&&image){_image=std::move(image);}这是两个基本相同的功能;一个采用左值引用,另一个采用右值引用。现在,我想既然std::forward应该返回一个左值引用,如果参数是一个左值引用和一个右值引用,如果参数是一个,这个代码可能是简化成这样:voidImageView::setImage(Image&&

c++ - 默认的 Move 构造函数是否定义为 noexcept?

在重新分配时决定是move还是复制元素之前,vector似乎会检查move构造函数是否标记为noexcept。默认move构造函数是否定义为noexcept?我看到了以下文档,但没有具体说明。http://en.cppreference.com/w/cpp/language/move_constructorImplicitly-declaredmoveconstructorIfnouser-definedmoveconstructorsareprovidedforaclasstype(struct,class,orunion),andallofthefollowingistrue:th