对basic_istream/ifstream/ofstream的bool的隐式强制转换在Visual Studio 2013中不起作用

evp*_*vpo 3 c++ c++11 visual-studio-2012 visual-studio-2013

以下代码在VS 2012中编译,但在VS 2013中编译

std::ofstream stm;
if(stm != NULL)
{
}
Run Code Online (Sandbox Code Playgroud)

在VS 2013中,您收到此编译错误:

二进制'!='找不到运算符,它接受类型为'std :: ofstream'的左手操作数(或者没有可接受的转换)

我查看了标题,<xiobase>然后发现了以下内容:

VS2012

ios_base::operator void *() const;
Run Code Online (Sandbox Code Playgroud)

VS2013

operator void *() const 已删除,并添加了显式操作符bool:

ios_base::explicit operator bool() const;
Run Code Online (Sandbox Code Playgroud)

现在我的问题:

  1. 我无法在互联网上找到有关此更改的任何信息.你知道在任何地方都有关于这种变化的官方文章吗?
  2. 我有遗留代码,其中if(stm!= NULL)被大量使用.出于无关的原因,最好不要更改代码.有没有办法让它在VS 2013中编译而不改变它?我找不到任何可以恢复运算符void*explicit从运算符bool()中删除的条件编译指令.

PS:gcc 4.9.0还有operator void*() const.所以它不会有这个问题.

更新:

为了使我的遗留代码编译,我按照建议实现了以下重载:

#include <xiosbase>

bool operator==(const std::basic_ios<char, char_traits<char>> &stm, int null_val)
{
    return static_cast<bool>(stm) == null_val;
}

bool operator==(int null_val, const std::basic_ios<char, char_traits<char>> &stm)
{
    return operator==(stm, null_val);
}

bool operator!=(int null_val, const std::basic_ios<char, char_traits<char>> &stm)
{
    return !operator==(stm, null_val);
}

bool operator!=(const std::basic_ios<char, char_traits<char>> &stm, int null_val)
{
    return !operator==(stm, null_val);
}
Run Code Online (Sandbox Code Playgroud)

在我的情况下,char值类型足够,第二个参数是int,因为不支持非NULL的东西.

Mic*_*urr 6

C++ 11要求一些布尔转换是显式的,以前是隐式的.附录C中提到了与C++ 03的兼容性:

C.2.15第27条:输入/输出库[diff.cpp03.input.output]

27.7.2.1.3,27.7.3.4,27.5.5.4

更改:在现有布尔转换运算符中指定显式的使用

理由:明确意图,避免变通方法.

对原始功能的影响:依赖于隐式布尔转换的有效C++ 2003代码将无法使用此国际标准进行编译.此类转换发生在以下条件中:

  • 将值传递给带有bool类型参数的函数;
  • 使用operator ==来比较false或true;
  • 从返回类型为bool的函数返回一个值;
  • 通过聚合初始化初始化bool类型的成员;
  • 初始化一个const bool&将绑定到一个临时的.