为什么当你写两次std :: cout时,它会显示十六进制值,然后显示你想输出的内容?
E.g。
std::cout << std::cout << "Hello!";
答案 0 :(得分:2)
std::cout
的类型为std::ostream
(或者来自的<<
它)。没有std::ostream
在右侧采用此类型,所以
编译器寻找转换。在pre-C ++ 11中,
void*
隐式转换为std::ostream
(用于...
条件),所以编译器使用这个;你所看到的是什么
转换运算符返回的输出(通常,
{{1}}对象本身的地址,但所有这些都是
要求是它是一个非空指针)。
答案 1 :(得分:0)
std::ostream
有一个转化运算符,允许转换为void*
,因此您可以测试操作是否成功。在表达
std::cout << std::cout // similar to
// std::cout.operator<<( std::cout.operator void*())
右侧操作数表达式std::cout
使用此转化运算符隐式转换为void const*
,然后operator<<
does the output of this via the ostream operand。另一种看待这种情况的方法是:
const void* cp = std::cout.operator void*();
std::cout << cp << "Hello!" << std::endl;
std::cout << std::cout << "Hello!";
输出:
0x601088Hello!
0x601088Hello!