0

考虑这个程序:

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

AFAIK 转换函数运算符 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 编译器按预期给了我一个错误。(在这里查看现场演示)

4

2 回答 2

6

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

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

于 2015-08-16T14:56:40.537 回答
2

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

不过,这也是一个编译器问题。具体来说,删除转换void *取决于直接向 -- 添加转换,bool但这又取决于向编译器添加“上下文转换”。

gcc 4.8 确实实现了一种形式的上下文转换,但没有实现标准接受的形式。尽管对上下文转换的特定更改不会直接影响上下文转换的这种使用,但它确实表明上下文转换的定义在编写这些编译器时仍在调整。

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

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

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

于 2015-08-16T15:23:38.237 回答