使用 gcc 13.2 和
-Wdangling-reference
编译我的代码,我很惊讶在这个简单的场景中(godbolt):
#include <vector>
#include <string>
std::string& add_variable(std::vector<std::string>& vars, const std::string& var)
{
vars.push_back( var );
return vars.back();
}
int main()
{
std::vector<std::string> vars;
const std::string& var = add_variable(vars, "name");
}
编译器警告:
<source>:13:41: warning: possibly dangling reference to a temporary [-Wdangling-reference]
13 | const std::string& var = add_variable(vars, "name");
| ^~~
<source>:13:59: note: the temporary was destroyed at the end of the full expression 'add_variable(vars, std::__cxx11::basic_string<char>(((const char*)"name"), std::allocator<char>()))'
13 | const std::string& var = add_variable(vars, "name");
|
这是误报还是我在这里遗漏了一些重要的东西?
确实,这看起来像是误报。
var
指的是你的std::string
中的vector<string>
,它在完整表达后仍然非常活跃。