中的编译器错误是无效的
我有代码,该代码使用三元运算符检查条件,然后将指针返回到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的错误。