来自移动页面cppreference 的
除非另有说明,所有标准库对象都具有
被移出的状态被置于有效但未指定的状态。那是,
仅限没有前提条件的函数,例如赋值
操作符,可以在对象被移动后安全地使用它
因此,从同一页面上的示例来看,下面的代码被认为是未定义的行为
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。发生这种情况有原因吗?或者它总是未定义的行为?
未指定并不意味着未定义。
根据C++11标准,第17.3.26节:
有效但未指定的状态未指定的对象状态,除了满足对象的不变量并且对象上的操作按照其类型指定的行为之外
当对象处于有效状态时,您可以将其流式传输到输出,因为流式传输没有其他前提条件。然而whatis print 是未指定的,所以它可能什么也不打印,或者打印出你的父亲有接骨木浆果的味道。您不能安全地使用具有附加先决条件的函数,例如back()
这还要求字符串非空。有效字符串可以为空。
对于未指定但有效的状态,包含旧值是完全可接受的选项。如果是基本类型,例如int
简单的复制只是执行移动的最有效方法。
还应该指出的是int
is not一个标准库对象,但是一个基本类型(如第 3.9.1 节中定义)。因此您的报价不适用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)