正在使用C 三元运算符中的字符串常数,一种无效的非效率数组的使用



我有代码,该代码使用三元运算符检查条件,然后将指针返回到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?

中的编译器错误是无效的

你是对的。如果另一个操作数是投掷表达,则三元运算符将传播一个操作数的类型和值类别。条件表达是const char[4]型的LVALUE。auto然后推论const char*。这里没有"无效的非效率数组的使用"。

另外,该代码与clang一起编译了。我会说这是GCC的错误。

最新更新