问题描述
对象(特别是 std
类的)是否允许自移动或它是未定义的行为?
举个例子:
#include <iostream>
#include <string>
int main()
{
std::string s("123");
s = std::move(s);
std::cout << s;
}
在 gcc/clang 中,程序不打印任何内容,因此在移动过程中会丢失 s
字符串:
https://gcc.godbolt.org/z/xqTWKfMxM
但在 MSVC 中它工作正常。
解决方法
来自cpp ref:
此外,使用 xvalue 参数调用的标准库函数可能假定参数是对对象的唯一引用;如果它是从带有 std::move 的左值构造的,则不进行别名检查。 但是,标准库类型的自移动赋值保证将对象置于有效(但通常未指定)状态:
std::vector<int> v = {2,3,3};
v = std::move(v); // the value of v is unspecified