How wide-spread is this GNU extension on ternary o

2019-02-19 13:01发布

This is a GNU extension on ternary operation according to the Wikipedia.

iMyVal = --iVal ?: iDft;

While I'm fully aware that this is a GNU extension, but sometimes things may come in very handy with this special syntax.

So, does anybody know if this syntax is only available in gcc? Or are they any other compilers which support it?

to anyone who's interested, PHP started supporting this syntax from 5.3

Thanks in advance.

2条回答
我想做一个坏孩纸
2楼-- · 2019-02-19 13:41

C++11 workaround:

template<typename Fcond, typename Flast>
auto ternary2support(Fcond fcond, Flast flast) -> decltype(fcond())
{
  auto    cond_result= fcond();
  return  cond_result? cond_result : flast();
}


#define ternary2(c,case0) ternary2support(  [&](){ return (c);}, [&](){ return (case0);} )


void test_tern2()
{
  int i= 3;

  int res1= ternary2(--i,1000);
  int res2= ternary2(--i,1000);
  int res3= ternary2(--i,1000);

  std::cout<<" res1="<< res1<<" res2="<< res2<<" res3="<< res3;
  // output: res1=2 res2=1 res3=1000

}

int main(){test_tern2(); return 0;}

Lambda lasyness prevents the condition recalculation and unnecassary case0 expression evaluation (as the original ternary operator extension works)

查看更多
别忘想泡老子
3楼-- · 2019-02-19 13:59

Some answers:

  1. GCC - yes
  2. MSVC - no (based on vanetto's answer)
  3. CLANG - no yes - the LLVM online compiler compiles it successfully.
  4. Intel C compiler - yes

Bottom line - not wide-spread. Only Intel's compiler, which is almost 100% gcc-compatible, supports this.?

查看更多
登录 后发表回答