2012-05-05 123 views
0
class A 
{ 
public: 
    A() 
    { 
     cout << "A()" << endl; 
    } 

    A(const A&) 
    { 
     cout << "A(const A&)" << endl; 
    } 

    A(A&&) 
    { 
     cout << "A(A&&)" << endl; 
    } 

    A& operator=(const A&) 
    { 
     cout << "A(const A&)" << endl; 
    } 

    A& operator=(A&&) 
    { 
     cout << "A(const A&&)" << endl; 
    } 

    ~A() 
    { 
     cout << "~A()" << endl; 
    } 
}; 

A&& f_1() 
{ 
    A a; 
    return static_cast<A&&>(a); 
} 

A f_2() 
{ 
    A a; 
    return static_cast<A&&>(a); 
} 

int main() 
{ 
    cout << "f_1:" << endl; 
    f_1(); 
    cout << "f_2:" << endl; 
    f_2(); 
} 

输出为:将一个函数声明为BigStruct && foo(...)是一个好习惯吗?

f_1: 
A() 
~A() 
f_2: 
A() 
A(A&&) 
~A() 
~A() 

示例代码明显表明,F_1()比F_2更有效()。

所以,我的问题是:

我们一定要声明一个功能some_return_type & & F(...);而不是some_return_type f(...); ?

如果回答我的问题是真实的,那么另一个问题如下:声明为some_return_type F(...)

已经有很多很多的功能;在C++世界中,我们是否应该将它们改为现代形式?

+2

你用'-Wall'编译了它吗? “警告:引用局部变量'a'返回”。这是在你的'f_1'定义中... – mfontanini

+0

http://stackoverflow.com/questions/4986673/c11-rvalues-and-move-semantics-confusion – Fanael

回答

6

这是一个很好的做法,宣布函数为BigStruct & & foo(...);

可怕的做法。与左值引用您正在做的是将引用返回给本地对象。当调用者接收到引用时,引用的对象已经消失。

已经有许多函数声明为some_return_type f(...);在C++世界中,我们是否应该将它们改为现代形式?

现代形式是他们已经建立的形式(只考虑返回类型)。标准被改为使通用表格更高效,而不是让所有人都重写他们的所有代码。

现在有非现代版本在那里,像void f(type& t)而不是type f()f创建的对象。那些我们想改变,以现代形式type f()为提供了一个简单的接口来思考,并提供简单的用户代码:

用户并不需要考虑对象是否修改创建

void read_input(std::vector<int>&); 

那是附加还是替换向量?

而且使来电者的代码更简单:

auto read_input(); 

std::vector<int> v; 
read_input(v); 
0

f_2您要阻止编译器应用NRVO。当您放下演员阵容,并在启用优化的情况下进行编译时,您会发现它效率一样。绝对不需要参照对象,因此在f_2中没有任何意义。

相关问题