相关疑难解决方法(0)

c ++ 11 emplace_back和push_back语法与struct

我正在使用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)

c++ rvalue-reference c++11

17
推荐指数
1
解决办法
5866
查看次数

std :: vector.push_back(std :: move(foo))有意义吗?

我在一些代码中遇到过这个问题(为清晰起见,细节已被删除):

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,因此没有非法访问等风险.

stl move-semantics c++11

4
推荐指数
1
解决办法
635
查看次数

标签 统计

c++11 ×2

c++ ×1

move-semantics ×1

rvalue-reference ×1

stl ×1