草庐IT

c++ - 为什么在这里调用 move 构造函数?

这是一个C++测验的代码示例:#includestructX{X(constchar*){std::cout程序的输出是什么?我是这样想的:f(Xa)被调用,构造函数将constchar*隐式转换为X,所以输出为1由于我们没有对象来存储返回值,所以返回值被丢弃,没有输出g(constchar*)被调用,Xc(b)X(constchar*)输出是1返回值被丢弃一次-无输出所以答案是11。测验的答案是131。我用g++4.4.4-13得到的答案是121。据说这段代码是用这个命令编译的:g++-std=c++11-Wall-Wextra-O-pthread中间的数字从何而来?为什么它可以是3

c++ - 禁用复制和 move 语义的最简洁方法

以下方法确实有效,但非常乏味:T(constT&)=delete;T(T&&)=delete;T&operator=(constT&)=delete;T&operator=(T&&)=delete;我正在尝试发现最简洁的方法。以下是否可行?T&operator=(T)=delete;更新请注意,我选择T&operator=(T)而不是T&operator=(constT&)或T&operator=(T&&),因为它可以同时满足这两个目的。 最佳答案 根据这张图表(由HowardHinnant提供):最简洁的方式是=deletemov

c++ - 允许在一个完整表达式中 move 两次

假设一个函数具有以下原型(prototype)templatestd::unique_ptrprocess_object(std::unique_ptrptr);该函数可能返回(move版本)传递给它的对象,或完全不同的对象。如下使用这个函数,C++合法吗?std::unique_ptrpw(newWidget());pw=process_object(std::move(pw));如果我没记错的话,有一条C/C++规则禁止在单个完整表达式中多次修改对象。这条规则在这里适用吗?如果是的话,有什么方法可以在一行中以不同的方式表达这个成语吗?如果将std::unique_ptr替换为被鄙视

c++ - 在什么情况下我应该明确需要实现 move 构造函数和 move 赋值运算符?

鉴于一个类实际上是可move的,手动实现类的move构造函数和move赋值运算符很快就会变得乏味。我想知道什么时候这样做实际上是一个沉重、沉重、过早的优化?例如,如果一个类只有微不足道的POD数据或本身定义了move构造函数和move赋值运算符的成员,那么我猜编译器要么只是优化大量的垃圾(在POD),否则使用成员的move构造函数和move赋值运算符。但这能保证吗?在什么情况下我应该期望明确需要实现move构造函数和move赋值运算符?编辑:如下所述,NicolBolas在https://stackoverflow.com/a/9966105/6345对他的回答的评论中提到,在Visu

c++ - libc++ vs libstdc++ std::is_move_assignable:哪个最正确?

我试图通过阅读C++14标准以及libc++和libstdc++的源代码来更深入地了解C++。各种执行type_traits项目在两者之间有所不同,尤其是is_move_assignable,我试图找出其中哪个“更正确”。libc++:templatestructis_move_assignable:publicis_assignable::type,consttypenameadd_rvalue_reference::type>{};libstdc++:template::value>struct__is_move_assignable_impl;templatestruct__is

c++ - 以下 move 构造函数代码安全吗?

这是类X的move构造函数:X::X(X&&rhs):base1(std::move(rhs)),base2(std::move(rhs)),mbr1(std::move(rhs.mbr1)),mbr2(std::move(rhs.mbr2)){}这些是我很警惕的事情:我们正在从rhs两次move,并且rhs不能保证处于有效状态。这不是base2初始化的未定义行为吗?我们正在将rhs的相应成员move到mbr1和mbr2但由于rhs已被move从(同样,它不能保证处于有效状态)为什么要这样做?这不是我的代码。我在一个网站上找到它。这个move构造函数安全吗?如果有,怎么做?

c++ - 我应该返回一个右值引用(通过 std::move'ing)吗?

一个C++Nextblogpost说过Acompute(…){Av;…returnv;}如果A具有可访问的拷贝或移动构造函数,编译器可能会选择省略拷贝。否则,如果A具有移动构造函数,则移动v。否则,如果A具有复制构造函数,则复制v。否则,会发出编译时错误。我认为我应该总是返回不带std::move的值因为编译器将能够为用户找出最佳选择。但在博客文章的另一个例子中Matrixoperator+(Matrix&&temp,Matrix&&y){temp+=y;returnstd::move(temp);}这里std::move是必要的,因为y必须被视为函数内的左值。啊,读完这篇博文后,我的

c++ - 为了支持 move 语义,函数参数应该由 unique_ptr、value 还是 rvalue 获取?

我的一个函数将vector作为参数并将其存储为成员变量。我正在使用对vector的const引用,如下所述。classTest{public:voidsomeFunction(conststd::vector&items){m_items=items;}private:std::vectorm_items;};但是,有时items包含大量字符串,所以我想添加一个支持move语义的函数(或用新函数替换该函数)。我正在考虑几种方法,但我不确定选择哪一种。1)unique_ptrvoidsomeFunction(std::unique_ptr>items){//Also,make`m_itm

c++ - propagate_on_container_move_assignment 的示例用法

我正在尝试了解如何正确书写AllocatorAware容器。我的理解是,propagate_on_container_move_assignmenttypedef表示Container本身被move-assign时是否需要复制某个Allocator类型。所以,由于我找不到这方面的任何示例,我自己的尝试将类似于以下内容:给定一个容器类型Container、一个Allocator类型allocator_type和一个内部allocator_type数据成员m_alloc:Container&operator=(Container&&other){if(std::allocator_trai

c++ - 默认 move 构造函数/赋值和删除的复制构造函数/赋值

按照标准,IfthedefinitionofaclassXdoesnotexplicitlydeclareamoveconstructor,onewillbeimplicitlydeclaredasdefaultedifandonlyif—Xdoesnothaveauser-declaredcopyconstructor,—Xdoesnothaveauser-declaredcopyassignmentoperator,—Xdoesnothaveauser-declaredmoveassignmentoperator,and—Xdoesnothaveauser-declareddest