【问题标题】:Why does this ternary result in a pointer being printed?为什么这个三元会导致打印指针?
【发布时间】:2021-01-03 00:17:45
【问题描述】:

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

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


    【解决方案1】:

    表达式

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

    被分组为

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

    pair.second是一个指针,选择ostream&lt;&lt;const void*重载。三元条件的两个分支都对输出没有影响。

    【讨论】:

      【解决方案2】:

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

      &lt;&lt; 的优先级高于?

      ss &lt;&lt; pair.second ? pair.second-&gt;toString() : "null"; 被分组为(ss &lt;&lt; pair.second) ? pair.second-&gt;toString() : "null";

      (ss &lt;&lt; pair.second) 评估流的状态,通常为true,因此pair.second-&gt;toString() 将被评估并丢弃结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-25
        • 2021-12-18
        • 1970-01-01
        • 2021-03-27
        • 1970-01-01
        • 1970-01-01
        • 2012-11-18
        • 1970-01-01
        相关资源
        最近更新 更多