c++ - 在调用函数中可以访问对字符串文字的返回引用(作为参数传递),但是,存储引用的返回对象为空
问题描述
我将一个字符串文字传递给一个函数,该函数只返回一个对它的 const 引用。在调用函数中,字符串是可访问和打印的。
但是,在另一个函数中,我正在实例化一个包含对字符串文字的 const 引用的类。返回此对象不会在调用函数中打印任何内容。
环境:Visual Studio 2017 (/std:c++=17)
这似乎不寻常。有什么线索吗?
class Test {
private:
const string& str_;
public:
Test(const string& str)
: str_{str}
{}
Test(const Test&) = delete;
Test& operator=(const Test&) = delete;
friend ostream& operator<<(ostream& out, const Test& t) {
return (out << t.str_);
}
};
const Test& returnString2(const string& str) {
return Test{ str };
}
const string& returnString1(const string& str) {
return str;
}
void testRef() {
cout << "testRef: " << returnString2("Roofus") << "\n";
}
解决方案
在:
const Test& returnString2(const string& str) {
return Test{ str };
}
您正在创建一个临时Test
的,您正在返回一个引用。但是这个临时的在函数结束时被销毁,导致未定义的行为。这与传入的 ref 无关- 它是已被销毁str
的临时对象。Test
对的引用str
仍然愉快地退出。
在:
const string& returnString1(const string& str) {
return str;
}
您只是返回传入的 ref - 当函数返回时它仍然存在,所以cout << "testRef: " << returnString2("Roofus") << "\n";
很好。
事实上,一个好的编译器会警告你(不确定 Visual Studio 做了什么——但我相信你可以打开这样的警告):https ://godbolt.org/z/E4s46bdEP
推荐阅读
- python - 使用熊猫中的两个地理数据框获取最近的距离
- bash - 如何在 Boto3 EMR 初始化中运行 bash 命令
- assembly - 汇编语言:比较用户输入失败
- reactjs - 链接组件顶部的按钮
- sql - SQL WHERE 在一列中查找 2 个数据
- lua - 尝试索引全局“变量”(零值)
- visual-studio - 错误:使用外部调试器时,进程已启动,但激活请求失败并出现错误“应用程序未启动”
- html - 如何阻止顶部标题折叠成汉堡菜单(响应式)?
- python - 根据可能值列表计算列表中的元素
- asynchronous - quarkus-vertx:来自 verticle 的非阻塞 db 调用导致 ContextNotActiveException