C++ 11标准对标准库相关的自移动赋值有何看法?更具体的是,什么(如果有的话)保证什么selfAssign呢?
template<class T>
std::vector<T> selfAssign(std::vector<T> v) {
v = std::move(v);
return v;
}
Run Code Online (Sandbox Code Playgroud) 关于移动分配的标准库策略是允许实现假设永远不会发生自我分配 ; 在我看来这是一个非常糟糕的主意,因为:
remove_if家庭中的任何事情都需要照顾这个角落的情况;那么,为什么这样的决定呢?
¹特别是在库代码中,实现者可以自由地利用关于"分支预期结果"的编译器特定提示(在VC++ __builtin_expect中的gcc/__assume中).
示例代码:
#include <iostream>
int main()
{
std::vector<int> w(20, 123), x;
w = std::move(w);
std::cout << w.size() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
g ++ 4.8.3上的输出: 0
当然,标准说移动赋值运算符使操作数处于未指定状态.例如,如果代码是x = std::move(w);那么我们期望w.size()为零.
但是,是否有指定的排序或其他条款涵盖自动案件?是否未指定大小是否为0或20其他内容或未定义的行为?标准容器在这里有任何定义的语义吗?
相关:此线程讨论您是否应该关心自己的类中的自动移动,但不讨论标准容器的移动赋值运算符是否执行,并且不提供标准引用.
NB.这与功能完全相同w = static_cast< std::vector<int> && >(w);或std::move不同吗?
有人可以给我提示为什么这段代码没有输出任何东西?我假设它与移动线有关...
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
vector<int> v{66,79,154,24,76,13,7};
v = move(v);
for(auto i: v)
cout << i << " ";
}
Run Code Online (Sandbox Code Playgroud)
更新:所以我添加了系统("暂停"); 帮助自己.我是否需要它并不是我所关注的.当我在Visual Studio 2013中再次运行代码时,它工作正常.但是,当我使用C++ 14运行Ideone时,它没有输出任何内容.现在有点困惑.