在C ++流中使用三元运算符是否可以?

时间:2016-04-27 15:48:07

标签: c++11 ternary-operator cout

以下代码:

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

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

使用c ++ 11在gcc 4.7上编译:

  

错误:类型&#39; int&#39;的操作数无效和&#39;&#39;到二进制&#39;运算符&lt;&lt;&lt;&#39;

我不明白为什么,这样做的正确方法是什么?我希望尽可能缩短空检,因为我希望它们非常普遍。

2 个答案:

答案 0 :(得分:3)

首先:是的,您可以将三元运算符用于std::ostream,但请注意运算符优先级。如果你打算这样做,你需要做这样的事情:

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

换句话说,将三元表达式封装在括号中。

其次,第二个和第三个操作数必须可以转换为相同的类型。换句话说,您的示例无法正常工作,因为您尝试插入字符串文字(""),如果a为空,或者实际数字(a->number,则为类型int)如果a不为空。

第三,您需要修复语法。但是@quamrana已经解决了那个问题。

答案 1 :(得分:1)

您发现运算符<<的绑定方式与您预期的不同。

使用:

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

(或者你刚刚打错并错过了:的{​​{1}})