2016-04-27 7 views
1

次のコード:C++ 11とGCC 4.7でコンパイルC++ストリームで三項演算子を使用しても構いませんか?

#include <iostream> 
using namespace std; 
struct A{int number=10;}; 

int main() 
{ 
    A* a = new A(); 
    cout<<"A val: "<< a==nullptr?"":a->number<<endl; 
} 

が与える:

error: invalid operands of types 'int' and '' to binary 'operator <<'

私はそれを行うための適切な方法にはどのようになるか、理由を理解していませんか?私は彼らが非常に一般的であることを期待して、できるだけ短いヌルチェックをしたい。

+0

ほとんどの人にとって、三項演算子は[驚くほど低い優先順位](http://en.cppreference.com/w/cpp/language/operator_precedence)です。私の提案:それが何をするかを絶対に確信していないときはいつでも、避けてください:あなたの同僚はあなたに感謝します。 – Wolf

答えて

3

まず:はい、あなたはstd::ostreamのための三項演算子を使用しますが、に注意することができますオペレータ優先度。あなたがそうしようとしている場合、あなたはこのような何かをする必要があります。

つまり
cout << "My name is: " << (my != nullptr ? my->name() : "don't know") << '\n'; 

は、括弧内の三元表現をカプセル化します。

第2に、第2オペランドと第3オペランドは同じ型に変換可能でなければなりません。つまり、aがヌルの場合は文字列リテラル("")を、aがnullでない場合は実際の数値(a->number、タイプはint)を挿入しようとしているため、この例は機能しません。

第3に、構文を修正する必要があります。しかし、@quamranaはすでにそれに対処しました。

1

オペレータ<<が期待どおりにバインドしていないことがわかりました。

用途:

cout << "A val: " << (a==nullptr ? "" : a->number) << endl; 

(またはあなただけのタイプミスをしたと?:から:を逃した)

+0

はい、申し訳ありません - それは?: –

+0

質問が三項演算子についての間に左シフト演算子に*最初の*を集中するのは少し誤解を招きます。しかし、最終的にあなたは正しいです。「<<' and '>>」の「快適さ」は、オンザフライでI/Oの式を計算する際には、毎日の計算に限られます。だからこそストリームI/Oのかっこを使って三項演算子の極端に低い優先順位を見つけ出すことを学ぶ方が効率的です... – Wolf

関連する問題