Hes*_*her 21 c++ gcc-statement-expression
我刚刚读了这样的代码:
auto value = ({
auto it = container.find(key);
it != container.end() ? it->second : default_value;
});
Run Code Online (Sandbox Code Playgroud)
这个叫什么({})?我想我以前从未见过这个。
Jar*_*d42 29
它是 gcc 扩展,所以不是标准 C++,
它是陈述式表达。
从 C++11 开始,大多数情况下您可以将立即调用函数表达式 (IIFE)与 lambda结合使用:
auto value = [&](){
auto it = container.find(key);
return it != container.end() ? it->second : default_value;
}();
Run Code Online (Sandbox Code Playgroud)
sup*_*cat 11
甚至在 C89 发布之前,gcc 的作者就发明了一种称为“语句表达式”的扩展,它本来是标准语言的有用部分。它采用最后一个语句是表达式的复合语句,并执行其中的所有内容,然后将最后一个表达式的值视为整个语句表达式的值。
虽然其他一些编译器有支持此类 gcc 扩展的选项,但标准拒绝识别未广泛使用的功能,再加上程序员不愿使用标准未识别的功能,造成了长达数十年的“鸡”和鸡蛋”的问题。