如何解决VS2019 /std:c++20模式下的C2039编译错误问题
报错原因
该问题是MSVC默认开启/std:c++20时同步启用/permissive-严格标准校验导致的,具体规则差异如下:
C++标准中用户定义字面量运算符是operator""加后缀组成的整体标识符,GCC和旧版本MSVC的宽松编译模式下,会把ns2::operator"" _ns作为一个完整运算符名称在ns2命名空间下查找。但MSVC的/permissive-严格模式下,名称查找逻辑会误将_ns作为独立标识符去ns2下匹配,找不到就抛出C2039错误。
开启/permissive实际是关闭了严格标准校验,回退到旧的宽松查找逻辑,所以编译可以通过。
合规修复方案
不需要开启/permissive也能兼容所有编译器的写法有两种:
- 先引入对应命名空间的运算符,直接用字面量写法调用:
template <typename T> static Duration fromNanoseconds(const T value) noexcept { using namespace ns2; value _ns; return {}; }
- 给完整运算符名称加括号,强制编译器将其作为整体查找:
(ns2::operator"" _ns)(value);
内容的提问来源于stack exchange,提问作者Steffen Roeber
相关产品推荐
相关产品推荐

