在C ++三元运算符中使用字符串常量是否会无效使用非左值数组?

时间:2019-06-30 23:22:59

标签: c++ gcc g++

我有使用三元运算符检查条件的代码,然后返回指向c字符串常量的指针或引发异常。

奇怪的是,只有当我从三元运算符的一个路径throw编译时,编译才会失败。如果我在字符串的两边都放一个常量,那么一切都会编译。

// this line gives no compilation error
auto str = condition ? "foo" : "bar";

// this line gives "error: invalid use of non-lvalue array"
auto str = condition ? "foo" : throw std::runtime_error{"bad"};

此问题已开始在gcc 9.1中显示。我使用具有上述两种模式的行已经很多年了,它们在clang和早期版本的gcc中编译时没有警告。

上述模式实际上是无效的,还是gcc 9.1中的编译器错误?

1 个答案:

答案 0 :(得分:2)

你是对的。如果另一个操作数是throw-expression,则三元运算符传播一个操作数的类型和值类别。条件表达式是类型const char[4]的左值。 auto然后推导const char*。这里没有“无效使用非左值数组”。

此外,代码还使用clang编译fine。我会说这是GCC的错误。