【发布时间】:2015-05-31 16:34:23
【问题描述】:
从this thread 可以清楚地看出,字符串文字不能用于返回 const string& 的函数,因为从 const char* 到 std::string 的隐式转换会创建一个临时变量。
但是如果我的返回类型完全匹配并且不需要转换,为什么我会收到警告“警告:返回对临时的引用”,例如:
include <iostream>
const int& test(){
return 2;
}
int main(){
std::cout << test();
}
返回值 2 不需要进行隐式转换,那么为什么会有警告呢?我认为使用 test() 与使用几乎相同
const int& example = 2;
这是完全有效的。此外,如果我将 2 更改为 2.2(所以它是双精度),尽管事实上存在从双精度到 int 的转换,但程序仍然运行(带有相同的警告)?如果有从 double 到 int 的转换,我不应该遇到类似于如何将 const char* 返回到字符串引用的问题吗?
【问题讨论】:
-
引用不能直接绑定到右值。相反,构造了一个
int类型的临时对象(在test内部)并初始化为2,并返回对该对象的引用。临时对象在那一刻被销毁,使引用悬空。 -
@Igor Tandetnik 我明白了,谢谢。对我来说,我链接的线程看起来像是一个只有在发生隐式转换时才会遇到的问题。
-
以及它“有效”的“事实”,嗯,这只是 UB。
-
欺骗stackoverflow.com/q/6896334/560648 虽然答案不是很好;你需要一个标准的报价,真的。
-
@LightnessRacesinOrbit 如果这里的答案质量更高,我们可能会关闭您链接的问题作为这个问题的欺骗?
标签: c++ reference return temporary