【发布时间】:2019-04-19 02:01:24
【问题描述】:
考虑以下代码:
int x;
int& f() {
return x ? x : throw 0;
}
使用gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04) 我得到以下编译错误:
cannot bind non-const lvalue reference of type ‘int&’ to an rvalue of type ‘int’
请注意,这在 clang 中编译得很好。这是(我认为是)标准中的相关声明:
N4659 [8.16.2.1](条件运算符):
第二个或第三个操作数(但不是两者)是一个(可能带括号的)抛出表达式(8.17);结果是对方的类型和值类别。
据我了解,x 是一个左值,所以在我看来clang 是对的。我错了吗?
如果我不得不猜测,左值到右值的转换正在发生,因为条件中的两个表达式没有相同的类型,但是因为第二个是抛出,所以这个转换应该被抢占。我不熟悉提交错误报告,但也许这会是一个更好的论坛。
以下是关于条件运算符的一些(可能)更有用的问题:
Why does this function return an lvalue reference given rvalue arguments?
Error: lvalue required in this simple C code? (Ternary with assignment?)
【问题讨论】:
-
显然是g++中的一个bug,Shafik提到的变化出现在C+14以后的标准中
标签: c++ g++ language-lawyer conditional-operator value-categories