在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中。
怎么了?
1条答案
按热度按时间wfveoks01#
失败的不是基本的“省略操作数的条件”特性,而是与
std::shared:ptr
的组合触发了GCC 9.1中修复的GCC中的一个bug。下面的代码从GCC 4.1.2开始工作:
字符串