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)
现在我的问题:
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的东西.
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&将绑定到一个临时的.
| 归档时间: |
|
| 查看次数: |
1778 次 |
| 最近记录: |