引用函数按值和自动返回

Reference to function return by value and auto

本文关键字:返回 函数 引用      更新时间:2023-10-16

从我理解的原因中,当您将变量定义为对函数返回的函数返回时,您实际上对具有终生绑定到参考的临时对象的引用,您必须将该参考称为const

话虽如此,为什么临时定义为const,以至于以下示例中的a2自动将是const
如果不允许您绑定对该临时对象的非const引用,那么为什么不默认情况下将临时对象本身const限制为呢?将其保持非con的原因是什么?

#include <string>
std::string getStringA()
{
    std::string myString = "SomeString";
    return myString;
}
const std::string getStringB()
{
    std::string myString = "SomeString";
    return myString;
}

int main()
{
    const std::string temp;
    std::string &a1 = getStringA();        // std::string& a1, warning C4239 : nonstandard extension used : 'initializing' : conversion from 'std::string' to 'std::string &'
    auto &a2 = getStringA();               // std::string& a2, warning C4239 : nonstandard extension used : 'initializing' : conversion from 'std::string' to 'std::string &'
    const std::string &a3 = getStringA();  // all good
    auto &b1 = getStringB();               // const std::string& b1
    auto &b2 = temp;                       // const std::string& b2
}

您不想返回 const值,因为它会杀死移动语义。

struct A {
    A() = default;
    A(A&&) = default;
    A(A const&) = delete;
};
A       foo() { return {}; }
A const bar() { return {}; }
int main()
{
  A a1 {foo()};
  A a2 {bar()}; // error here
}

,这是要付出的代价太多,只是为了让自己键入auto const&的麻烦,以绑定到临时。