为什么调用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
答案 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(); }
版本。