MSVC中auto推导std::ios::binary类型异常是否为编译器Bug?
关于MSVC编译std::ios::openmode位运算的问题
以下C++代码可在GCC、ICC和Clang中正常编译,但在MSVC中编译失败:
#include <ios> int main() { auto open_flags = std::ios::binary; open_flags |= std::ios::app; return 0; }
(6): error C2678: 二进制运算符'|=':找不到接受左侧操作数类型为'std::_Iosb::_Openmode'的运算符(或无可接受的转换)
修改代码后可获得更明确的错误信息:
#include <ios> int main() { auto open_flags = std::ios::binary; open_flags = open_flags | std::ios::app; return 0; }
(6): error C2440: '=':无法从'int'转换为'std::_Iosb::_Openmode'
而以下代码可在MSVC中正常编译:
#include <ios> int main() { auto open_flags = std::ios::binary | std::ios::out; open_flags = open_flags | std::ios::app; return 0; }
从现象来看,MSVC的表现存在异常:疑似它将|运算符的返回类型实现为int而非std::ios::openmode。另外值得注意的是,若将auto替换为std::ios::openmode,原代码可正常编译,推测是通过隐式转换实现的。
请问这是MSVC的Bug,还是我遗漏了C++标准中的某些细节?欢迎提供标准依据!
内容的提问来源于stack exchange,提问作者Neil Stephens
相关产品推荐
相关产品推荐

