为什么要使用条件运算符? : 导致返回本地临时对象?

问题描述 投票:0回答:1

我遇到了一个问题,即使用条件运算符在 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 也很好。有人可以解释为什么第一种方法返回临时对象吗?

是因为条件运算符求值后构造了一个字符串对象吗?

c++ compiler-warnings
1个回答
0
投票

是的,条件运算符的返回类型是操作数的公共类型。给定

first ? hello : world;
,它将是
std::string
。需要为
std::string
构造一个临时
world
,然后使用该临时值来构造稍后返回的
std::string_view
,这可能会造成麻烦。

© www.soinside.com 2019 - 2024. All rights reserved.