我遇到了一个问题,即使用条件运算符在 MSVC 中返回垃圾 string_view,因为 string_view 由临时对象支持?。
#include <string>
#include <iostream>
std::string hello("Hello");
char world[6] = { "World" };
std::string_view ChooseString( bool first )
{
// warning: returning address of local temporary object
return first ? hello : world; // returned string_view is garbage
// all other ways of returning string_view works fine
/*if ( first )
return hello;
else
return world;*/
//return first ? std::string_view( hello ) : std::string_view( world );
//return hello;
//return world;
}
int main()
{
std::cout << ChooseString(true) << std::endl;
std::cout << ChooseString(false) << std::endl;
}
然后我在 goldbot 上尝试了 clang 和 gcc,它们有相同的行为,其中 clang 发出警告:返回本地临时对象的地址。仅仅返回 hello 或 world 也很好。有人可以解释为什么第一种方法返回临时对象吗?
是因为条件运算符求值后构造了一个字符串对象吗?
是的,条件运算符的返回类型是操作数的公共类型。给定
first ? hello : world;
,它将是 std::string
。需要为 std::string
构造一个临时 world
,然后使用该临时值来构造稍后返回的 std::string_view
,这可能会造成麻烦。