std :: move on返回值导致额外的临时对象创建

时间:2014-01-21 10:54:44

标签: c++11 move-semantics

为什么调用get_data2()会导致额外的c-tor调用(g ++ 4.7.1 -std = c ++ 11 -O3)?

代码:

#include <iostream>

struct data {
    data(data&&){std::cout << "cted(&&): " << (void*) this << std::endl; }
    data(data const&){std::cout << "cted(c&): " << (void*) this << std::endl; }
    data(){std::cout << "cted(): " << (void*) this << std::endl; }
    ~data(){std::cout << "dted(): " << (void*) this << std::endl; }
};

data create_data() { return data(); }

// with this one the c-tor is called twice
data get_data2() { return std::move(create_data()); }

// with this one the c-tor is called once
data get_data1() { return create_data(); }
int main() { data var = get_data1(); return 0; }

使用get_data2()输出:

cted(): 0x7ffffb2cd3df
cted(&&): 0x7ffffb2cd40f
dted(): 0x7ffffb2cd3df
dted(): 0x7ffffb2cd40f

使用get_data1()输出:

cted(): 0x7ffffd7f230f
dted(): 0x7ffffd7f230f

1 个答案:

答案 0 :(得分:4)

问题在于显式std::move禁止复制省略,请参阅Why does std::move prevent RVO?另一个问题是显式移动也是不必要的,因为在data create_data() { return data(); }中您已经返回了右值。

作为旁注:前一段时间出现了一个非常相似的问题,事实证明,用于跟踪对象创建的方式非常不可靠,部分原因是对象为空,请参阅RVO force compilation error on failure。 / p>

长话短说:只使用data create_data() { return data(); }版本。