草庐IT

c++ - 在 move 语义的上下文中, "Regular Type"是什么?

AlexStepanovdefinedRegularTypes作为满足复制和相等某些属性的类型。现在C++11已将move语义添加到泛型编程领域,Stepanov的定义不再完整。我正在寻找关于常规类型的良好引用,包括它们与move语义的交互。 最佳答案 总结:对于C++11,我将包括:move-ctor(noexcept)move分配(noexcept)总排序(operator表示自然总排序,std::less表示自然排序总订单不存在)。hash并且会删除:swap()(非throw)-被move操作取代。评论Alex在Elemen

c++ - 编译器生成的 move 构造函数的行为是什么?

是否std::is_move_constructible::value==true暗示T有一个可用的move构造函数?如果是这样,它的默认行为是什么?考虑以下情况:structfoo{int*ptr;};intmain(){{std::cout::value输出是:10000000C0000000C我以为f.ptr应该是nullptr.所以在这种情况下,是f2move构造?如果是,右值不应该失效吗?我如何知道类的实例是否可以正确move构造(使旧实例无效)?(我正在使用VS11。)更新move构造函数的默认行为与复制构造函数相同,是否正确?如果是真的,我们总是希望movector窃取被

c++ - 编译器生成的 move 构造函数的行为是什么?

是否std::is_move_constructible::value==true暗示T有一个可用的move构造函数?如果是这样,它的默认行为是什么?考虑以下情况:structfoo{int*ptr;};intmain(){{std::cout::value输出是:10000000C0000000C我以为f.ptr应该是nullptr.所以在这种情况下,是f2move构造?如果是,右值不应该失效吗?我如何知道类的实例是否可以正确move构造(使旧实例无效)?(我正在使用VS11。)更新move构造函数的默认行为与复制构造函数相同,是否正确?如果是真的,我们总是希望movector窃取被

c++ - 对于按值传递的重成员,构造函数的初始化列表中真的需要 std::move 吗?

最近我从cppreference.../vector/emplace_back中阅读了一个示例:structPresident{std::stringname;std::stringcountry;intyear;President(std::stringp_name,std::stringp_country,intp_year):name(std::move(p_name)),country(std::move(p_country)),year(p_year){std::cout我的问题:这std::move真的需要吗?我的观点是这个p_name没有用在构造函数的主体中,所以,也许语

c++ - 对于按值传递的重成员,构造函数的初始化列表中真的需要 std::move 吗?

最近我从cppreference.../vector/emplace_back中阅读了一个示例:structPresident{std::stringname;std::stringcountry;intyear;President(std::stringp_name,std::stringp_country,intp_year):name(std::move(p_name)),country(std::move(p_country)),year(p_year){std::cout我的问题:这std::move真的需要吗?我的观点是这个p_name没有用在构造函数的主体中,所以,也许语

c++ - 这是 C++ 'move' 语义的正确用法吗?

今晚我一直在看一些我过去几天一直在处理的代码,并开始阅读move语义,特别是std::move。我有几个问题要问各位专业人士,以确保我走的是正确的道路,而不是做出任何愚蠢的假设!首先:1)最初,我的代码有一个返回大vector的函数:templateclassMyObject{public:std::vectordoSomething()const;{std::vectortheVector;//produce/workwithavectorrightherereturn(theVector);};//eodoSomething};//eoclassMyObject鉴于“theVect

c++ - 这是 C++ 'move' 语义的正确用法吗?

今晚我一直在看一些我过去几天一直在处理的代码,并开始阅读move语义,特别是std::move。我有几个问题要问各位专业人士,以确保我走的是正确的道路,而不是做出任何愚蠢的假设!首先:1)最初,我的代码有一个返回大vector的函数:templateclassMyObject{public:std::vectordoSomething()const;{std::vectortheVector;//produce/workwithavectorrightherereturn(theVector);};//eodoSomething};//eoclassMyObject鉴于“theVect

c++ - 从 C++11 中的函数调用返回 std::vector 的正确方法( move 语义)

我想填充std::vector(或其他一些STL容器):classFoo{public:Foo(int_n,constBar&_m);private:std::vectorfooes_;}1.好看的ctor,性能昂贵std::vectorget_vector(int_n,constBar&_m){std::vectorret;...//fillingretdependingfromargumentsreturnret;}Foo::Foo(int_n,constBar&_m):fooes_(get_vector(_n,_m){}2.更好的性能,更差的ctorvoidfill_vector

c++ - 从 C++11 中的函数调用返回 std::vector 的正确方法( move 语义)

我想填充std::vector(或其他一些STL容器):classFoo{public:Foo(int_n,constBar&_m);private:std::vectorfooes_;}1.好看的ctor,性能昂贵std::vectorget_vector(int_n,constBar&_m){std::vectorret;...//fillingretdependingfromargumentsreturnret;}Foo::Foo(int_n,constBar&_m):fooes_(get_vector(_n,_m){}2.更好的性能,更差的ctorvoidfill_vector

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

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