Mat*_*ias 8 c++ language-lawyer move-semantics c++11
考虑这段代码
Foo f1;
Foo f2{ std::move(f1) };
Run Code Online (Sandbox Code Playgroud)
我希望成员值f1
不再必须保持默认构造函数给出的值.但是,使用此实现进行多个编译器的测试Foo
表明不然.
class Foo
{
public:
Foo() = default;
Foo(Foo &&) = default;
std::string s{ "foo" };
bool t{ true };
bool f{ false };
};
Run Code Online (Sandbox Code Playgroud)
移动f1.t
总是true
并且f1.f
永远是false
.正如在这个问题中所描述的那样,我希望这些值要么是不确定的,要么两个布尔值都具有相同的值.但是,它们似乎获得了与默认构造函数相同的值.
这只是我的编译器的实现细节(巧合相同)还是在标准中?
Bar*_*rry 11
移动
f1.t
总是true
并且f1.f
永远是false
.
对于基本类型,移动就是复制.你不会希望你的实现复制的布尔和零出旧的-这是不必要的额外工作.在一个简单的POD中,移动只是一个memcpy
- 但如果你的建议会发生,你也必须做一个memset
.什么都不做就快得多.
这只是我的编译器的实现细节(巧合相同)还是在标准中?
这是[class.copy]中的标准:
对于非工会类X的隐式定义的复制/移动赋值运算符执行按成员及其子对象的禁止复制/移动分配.[...]每个子对象都以适合其类型的方式分配:
- [...]
- 如果子对象是标量类型,则使用内置赋值运算符.