当引用引用函数的返回值时,它是否有效?

Does it work when a reference refers to a function's return value?

提问人:f1msch 提问时间:7/18/2023 最后编辑:Toby Speightf1msch 更新时间:7/20/2023 访问量:124

问:

class AA {
private:
    string s = "asd";
public:
    string func1() {
        return s;
    }
    string& func2() {
        return s;
    }
};

func1()返回一个副本并返回一个引用。 电话就像func2()

AA a;
auto &r1 = a.func1();
auto &r2 = a.func2();

在我测试它们后,两者都工作正常。 但这是我的怀疑。 指 ;我明白了。但是否也指?还是匿名返回值? 如果是前者,怎么做呢?RVO?r2AA::sr1AA::sfunc1func1

C++ 返回值 return-value-optimization

评论

6赞 UnholySheep 7/18/2023
auto &r1 = a.func1();不编译:godbolt.org/z/s4T1K3qjE
3赞 molbdnilo 7/18/2023
如果它编译(它不应该编译,但 Visual C++ 会这样做)引用一个不存在的对象,并且似乎只是通过未定义行为的本质“工作”。(您无法通过测试来确定是否存在未定义的行为。r1
2赞 Rodney 7/18/2023
const auto &r1 = a.func1();是合法的。它不是 UB,因为它延长了返回对象的生存期。
3赞 Rodney 7/18/2023
Whenever a reference is bound to a temporary object or to a subobject thereof, the lifetime of the temporary object is extended to match the lifetime of the reference en.cppreference.com/w/cpp/language/reference_initialization
3赞 Eljay 7/18/2023
如果您使用的是 Visual Studio (CL.EXE),我建议使用该标志来禁用 Microsoft 对标准 C++ 的扩展和更改,而不是使用 Microsoft 的不兼容 C++。(我对 GNU 的 GCC 和 LLVM 提出了类似的建议。/permissive-g++clang++

答:

1赞 user12002570 7/18/2023 #1

在我测试后,两者都工作正常

不,前者不是合法/有效的 C++,因为按返回,并且占位符类型推导使用模板参数推导规则。这意味着情况/问题与问题相似,就好像你要写:auto &r1 = a.func1();func1

template<typename T> void deducefromauto(T &t);
deducefromauto(a.func1()); //won't work because non-const lvalue reference can't be bound to rvalue

这不起作用,因为非常量左值引用不能绑定到右值。