我正在使用MSVC,Visual Studio 2013.
假设我有一个结构:
struct my_pair {
int foo, bar;
};
Run Code Online (Sandbox Code Playgroud)
我想有效地添加一堆这些,而不是创建一个临时的,然后丢弃它:
vector<my_pair> v;
v.push_back(41, 42); // does not work [a]
v.push_back({41,42}); // works [b]
v.emplace_back(41,42); // does not work [c]
v.emplace_back({41,42}); // does not work [d]
v.emplace_back(my_pair{41,42}); //works [e]
Run Code Online (Sandbox Code Playgroud)
现在,如果我将构造函数和复制构造函数添加到我的代码中:
my_pair(int foo_, int bar_) : foo(foo_), bar(bar_)
{
cout << "in cstor" << endl;
}
my_pair(const my_pair& copy) : foo(copy.foo), bar(copy.bar)
{
cout << "in copy cstor" << endl;
}
Run Code Online (Sandbox Code Playgroud)
然后行为改变:
v.push_back(41, 42); // does not work [f]
v.push_back({41,42}); …Run Code Online (Sandbox Code Playgroud) 我在一些代码中遇到过这个问题(为清晰起见,细节已被删除):
std::vector<std::vector<int>> foo;
{
std::vector<int> bar = {42};
foo.push_back(std::move(bar)); // Hmmm...
} // Indicate `bar` is no longer needed.
Run Code Online (Sandbox Code Playgroud)
在std::move不需要我的容貌,但果真如此吗?这种行为有什么不同foo.push_back(bar);吗?如果不是int元素是一个类,如pcl::PointXYZ在我的实际代码中那么?
更新:我已经更改了代码,以更明确地表明bar之后没有使用std::move,因此没有非法访问等风险.