【发布时间】:2015-01-21 05:31:12
【问题描述】:
为什么可以将std::ostream 转换为void 指针?我不知道std::ostream 中有任何此类转换运算符。代码如下
#include <iostream>
int main()
{
void *p = std::cout; // why does this work?
}
我之所以问这个问题,是因为我看到一个放置操作符 new 被调用为
Foo* pFoo = new (std::cerr) Foo;
完全不知道为什么要写这样的东西。
PS:我正在使用 g++ 4.9.2 进行编译,带或不带 -std=c++11。 clang++ 不接受代码。
PSS:发现由于所谓的“安全布尔问题”(参见@nicebyte 的答案),在 C++11 之前,为 std::ostream 定义了一个 void* 转换运算符,然后在 C 中将其删除++11。但是,我的代码使用 g++ 在 C++11 中编译得很好。更重要的是,无论我使用什么版本的标准,clang++ 都会拒绝它,即使使用-std=c++98,尽管我的理解是如果编译为 pre-C++11,它应该接受。
【问题讨论】:
-
new (std::cerr) Foo?什么。这。地狱。 -
@Quentin :) 当我看到它时,我就是这么告诉自己的。
-
如果你能提供来源,我会很高兴的。我只能想到这可能导致的可怕事情。
-
在 Scott Meyers 的书“Effective C++”,第 52 项,第 291 页(第 3 版)中
-
今天我学到了一些东西,谢谢!这肯定是一个奇怪的小动物......
标签: c++ pointers implicit-conversion ostream