【发布时间】:2011-09-17 08:42:04
【问题描述】:
下面会报编译错误吗?
delete cout;
delete cin;
答案是:没有。
这是标准库中流类的实现中的一个缺陷。它们具有以下到void*类型的转换函数,这意味着所有流对象都可以隐式转换为void*:
operator void * ( ) const;
这通常非常有用,因为它可以让我们写very idiomatic loop,例如,当从文件中读取输入时。但同时,它允许用户写delete stream。正如我所说,您可以删除任何流对象。所以所有这些都是允许的:
delete ss; //declare std::stringstream ss;
delete iss; //declare std::istringstream iss;
delete oss; //declare std::ostringstream oss;
只是他们会发出警告,说(见ideone):
警告:删除‘void*’是未定义的
你可以easily avoid 只需将其转换为char*。但是程序还是有问题,运行时很可能会崩溃。
--
所以我的问题是,这个问题是否在 C++11 中得到解决和修复?以下文章提供了一个解决此问题的方法:
--
编辑:
来自@Xeo 对@Alf 回答的评论:
提出解决此问题的论文:
【问题讨论】:
-
c++ 为您提供了很多方法来让自己在脚下开枪。这是其中之一 ;)
-
我会说这是直射眼睛! :-)
-
幸运的是,有一个简单的解决方法,用“那么不要那样做”的语言:)
-
@Nawaz:Safe Bool 习语是在 C++98 发布之后发明的(我不知道 C++03),所以这很正常。请注意,尽管他们已经有所考虑,因为他们使用
void*(在大多数情况下会发出警告)而不是直接使用char*或bool。 -
你不应该更担心
memcpy(cout, cin, 10);没有任何警告。
标签: c++ stream c++11 implicit-conversion