首页 > 解决方案 > 为什么这个三元会导致打印指针?

问题描述

这个三元组,当按原样使用时,会吐出一个指针:

std::stringstream ss;
ss << pair.second ? pair.second->toString() : "null";
std::cout << ss.str() << '\n';

这是一个示例输出:

{
        "glossary": 000002B96B321F48
}

但是当我将三元运算符括在括号中时,它可以正常工作并给我 toString() 或“null”的内容。

ss << (pair.second ? pair.second->toString() : "null");

此外,将其扩展为适当的 if/else 也可以修复它:

if (pair.second)
{
    ss << pair.second->toString();
}
else
{
    ss << "null";
}

这是怎么回事?

标签: c++conditional-operator

解决方案


https://en.cppreference.com/w/cpp/language/operator_precedence

<<优先级高于?

ss << pair.second ? pair.second->toString() : "null";被分组为(ss << pair.second) ? pair.second->toString() : "null";

(ss << pair.second)评估流的状态,通常是true,因此 pair.second->toString()将被评估并丢弃结果。


推荐阅读