提问人:f1msch 提问时间:7/18/2023 最后编辑:Toby Speightf1msch 更新时间:7/20/2023 访问量:124
当引用引用函数的返回值时,它是否有效?
Does it work when a reference refers to a function's return value?
问:
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?r2
AA::s
r1
AA::s
func1
func1
答:
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
这不起作用,因为非常量左值引用不能绑定到右值。
评论
auto &r1 = a.func1();
不编译:godbolt.org/z/s4T1K3qjEr1
const auto &r1 = a.func1();
是合法的。它不是 UB,因为它延长了返回对象的生存期。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/permissive-
g++
clang++