草庐IT

c++ - 抽象类和 move 语义

根据“五规则”,当我声明以下之一时:复制或move操作或析构函数我必须编写所有这些,因为编译器不会为我生成它们(其中一些)。但是,如果我的类(A)派生自带有虚拟析构函数的抽象类,这是否意味着A类中的析构函数将被视为“用户定义的”?因此,move语义是否不适用于此类A的对象,因为编译器不会为我生成move构造函数?structInterface{virtualvoidmyFunction()=0;virtual~Interface(){};};structA:publicInterface{voidmyFunction()override{};}; 最佳答案

c++ - 将 unique_ptrs 从一个 vector move 到另一个 vector

我想将存储在它们的未排序vector中的unique_ptrmove到另一个vector,该vector将包含指针的排序vector。确定moveunique_ptr不会自动删除第一个vector中的元素吗?我该怎么做?我想做的例子:std::vector>unsorted,sorted;//fillthe"unsorted"vectorwhile(unsorted.size()>0){constautoit=find_next_element_to_add_to_sorted(unsorted);sorted.push_back(std::move(*it));}我希望意图很明确。更

c++ - C++11 编译器何时会使 RVO 和 NRVO 优于 move 语义和 const 引用绑定(bind)?

考虑从函数返回启用move语义的“完整”对象的情况,如std::basic_string:std::wstringbuild_report()const{std::wstringreport;...returnreport;}那么,我是否真的可以做出“最佳”选择,是否将返回的字符串与move语义一起使用,如conststd::wstringreport(std::move(build_report()));或者如果我应该依靠(N)RVO来发生conststd::wstringreport(build_report());或什至将const引用绑定(bind)到临时用conststd::

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必须被视为函数内的左值。啊,读完这篇博文后,我的