operator void*() 转换仍然是 C++ 库的一部分吗?

Is operator void*() conversion still part of C++ library?

考虑这个程序:

#include <iostream>
int main()
{
    delete std::cout;
}

AFAIK 转换函数 operator void* () const 已从 C++11 中删除。因此,该程序在 C++11 编译器上的编译应该会失败。是的,g++ 4.8.1 和 4.9.2 都给出了诊断(以删除 void* 未定义的警告形式,这也是一件好事)。但是这个程序不应该因为在 C++98 和 C++03 中所有流对象都可以隐式转换为 void* 的转换函数的删除而在编译中失败吗?这是错误吗?他们仍未实施此更改似乎有点令人惊讶。

我已经在 g++ 4.9.2(支持 C++14)中尝试过这个程序,但它给出的是警告,而不是编译器错误。 Ideone 编译器按预期给我一个错误。 (查看现场演示 here

与编译器无关,是库问题。 libstdc++ 与 C++11 有很多不兼容性,这只是其中之一。他们正在通过 iirc 在 5 及更高版本中进行重大更改。

简而言之,这既不是错误也不是编译器问题。

这是标准库中的错误(如果您将其视为 C++11/14 标准库而不是 C++98/03 的实现)。

这也是编译器问题。具体来说,删除到 void * 的转换取决于直接向 bool 添加转换——但这又取决于向编译器添加 "contextual conversion"。

gcc 4.8 确实实现了一种上下文转换形式,但不是标准中接受的形式。尽管对上下文转换的具体更改不会直接影响上下文转换的这种使用,但它确实指出了这样一个事实,即在编写这些编译器时上下文转换的定义仍在调整中.

事情(至少通常)发生的顺序是首先规范被固化。然后编译器实现它。然后标准库将其投入使用。

在这种情况下,规范在编译器发布前不久仍在不断变化。因此,标准库没有(实际上,不能)使用它。

到 4.9 时,规范已经确定,编译器实现了上下文转换的最终版本,但还没有足够长的时间在标准库中使用。