【发布时间】:2015-11-27 13:08:57
【问题描述】:
来自 cppreference 的move page
除非另有说明,否则所有具有 被移出的被置于有效但未指定的状态。那是, 只有没有前置条件的函数,比如赋值 运算符,可以在对象被移动后安全地用于对象
因此,从同一页面上的示例来看,下面的代码被认为是未定义的行为
vector<string> v_string;
string example = "example";
v_string.push_back(move(example));
cout << example << endl;
MSVC 不会在控制台上输出任何内容,但如果我这样做了
vector<int> v_int;
int number = 10;
v_int.push_back(move(number));
cout << number << endl;
将输出 10。发生这种情况有什么原因吗?还是它总是未定义的行为?
【问题讨论】:
-
我认为“有效状态”是指保持对象不变量。因此,例如,将其流式传输到标准输出应该没问题,但您无法安全地访问
example[0]。我认为你的例子都没有显示 UB。 -
unspecified != undefined,你可以打印字符串,但不能保证里面有什么。
-
嗯,在我看到的所有实现中,STL 容器和字符串在移动后都会变为空。
-
一个字符串被移动后,不知道它包含什么。但是它会在内部处于一个定义良好(如果你不知道)的状态。所以将它发送到
std::cout不会破坏程序的稳定性。但它可以包含它在移动之前包含的所有内容,或者它可能是空的。通常你不会移动一个左值,除非你没有进一步使用它。如果你这样做了,那么你的下一个动作应该是重新初始化它。 -
对于标量移动与复制相同,因此
int保持不变。对于您的string示例,这取决于它的operator<<是否有任何先决条件,而IIRC 没有。