Wikipediaによると、これは三項演算の GNU 拡張です。
iMyVal = --iVal ?: iDft;
これが GNU 拡張機能であることは十分承知していますが、この特殊な構文を使用すると非常に便利な場合があります。
では、この構文が でのみ使用できるかどうかを知っている人はいますgcc
か? それとも、それをサポートする他のコンパイラですか?
興味のある人には、PHP は 5.3 からこの構文をサポートし始めました。
前もって感謝します。
Wikipediaによると、これは三項演算の GNU 拡張です。
iMyVal = --iVal ?: iDft;
これが GNU 拡張機能であることは十分承知していますが、この特殊な構文を使用すると非常に便利な場合があります。
では、この構文が でのみ使用できるかどうかを知っている人はいますgcc
か? それとも、それをサポートする他のコンパイラですか?
興味のある人には、PHP は 5.3 からこの構文をサポートし始めました。
前もって感謝します。
いくつかの答え:
結論 -広く普及していません。ほぼ 100% gcc と互換性のある Intel のコンパイラのみがこれをサポートしています。?
C++11 の回避策:
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;}
ラムダ遅延により、条件の再計算と不必要な case0 式の評価が防止されます (元の三項演算子拡張が機能するため)