如何在GCC中启用C/C++“带省略操作数的条件运算符”(又名Elvis运算符“?:“)

tsm1rwdh  于 5个月前  发布在  C/C++
关注(0)|答案(1)|浏览(61)

在CppCon2019的演讲Non-conforming C++中,介绍了C++中的“Elvis运算符”,这是许多编译器支持的非标准扩展。
它的工作原理是省略?:表达式的中间操作数:

std::shared_ptr<foo> read();
std::shared_ptr<foo> default_value();

auto read_or_default()
{
    return read() ?: default_value();
}

字符串
这正是从presentation的载玻片11中采集的样本。
然而,当我在Ubuntu 18.04上的GCC 7.4.0上构建它时,或者在MinGW上使用GCC 8.2.0,使用-std=gnu++14标志,我得到这个错误:

error: lvalue required as unary '&' operand
     return read() ?: default_value();
                                    ^


在谈话中,据说这个扩展至少从4.1.2版本开始就存在于GCC中。
怎么了?

wfveoks0

wfveoks01#

失败的不是基本的“省略操作数的条件”特性,而是与std::shared:ptr的组合触发了GCC 9.1中修复的GCC中的一个bug。
下面的代码从GCC 4.1.2开始工作:

int read();
int default_value();

int read_or_default()
{
    return read() ?: default_value();
}

字符串

相关问题