Closed. This question is opinion-based。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
                        
                        5年前关闭。
                                                                                            
                
        
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();
}


输出为:

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 ++世界中,我们应该将它们更改为现代形式吗?

最佳答案

将函数声明为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);

关于c++ - 将函数声明为BigStruct && foo(…);是一种好习惯吗? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10463535/

10-12 18:47