【发布时间】:2021-06-04 19:54:05
【问题描述】:
我正在使用以下代码进行一些测试:
#include <iostream>
#include <string>
using namespace std;
string& changeSomething(string&& s) {
s[0] = 'a';
return s;
}
int main() {
string s = changeSomething("hello");
cout << s << endl;
}
这里我将一个右值引用传递给函数,并返回一个对对象的引用。这里的问题是我认为这会给 UB,因为我将一个 r 值传递给函数并且它没有分配内存地址,但是这个输出:
再见
这里有什么我遗漏的吗?
【问题讨论】:
-
仅仅因为它似乎工作,并不意味着它不是UB。
-
@AyxanHaqverdili 我的意思是,你是对的。但是由于我无法检查是否是UB,所以我希望有人指出它是否真的是。
-
您可以使用
-fsanitize=address -fsanitize=undefined了解基本概念。然后使用一个真正的调试器 - printf 查看何时调用构造函数/析构函数。 -
这段代码实际上定义良好 (1) 创建了一个临时的
std::string,它用字符串文字"hello"初始化。 (2) 对该临时文件的引用被传递给changeSomething()。 (3)changeSomething()改变临时变量,并返回对它的引用。 (4) 控制权返回main(),并且返回的引用(指临时)用于初始化s- 这是通过复制(修改的)临时发生的 (5) 临时停止在结束时存在表达式/语句。 (6) 在下一条语句中输出s。
标签: c++ visual-studio c++11