为什么这个三元组会导致打印指针?
Why does this ternary result in a pointer being printed?
这个三进制,当按原样使用时,吐出一个指针:
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";
}
怎么回事?
表达式
ss << pair.second ? pair.second->toString() : "null"
分组为
(ss << pair.second) ? pair.second->toString() : "null"
pair.second
是一个指针,选择了ostream
<<
的const void*
重载。三元条件的两个分支对输出没有影响。
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()
并丢弃结果。
这个三进制,当按原样使用时,吐出一个指针:
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";
}
怎么回事?
表达式
ss << pair.second ? pair.second->toString() : "null"
分组为
(ss << pair.second) ? pair.second->toString() : "null"
pair.second
是一个指针,选择了ostream
<<
的const void*
重载。三元条件的两个分支对输出没有影响。
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()
并丢弃结果。