c++ - MSVC 中可能的编译器错误
问题描述
以下代码使用 gcc 和 clang(以及许多其他 C++11 编译器)编译
#include <stdint.h>
typedef int datatype;
template <typename T>
struct to_datatype {};
template <>
struct to_datatype<int16_t> {
static constexpr datatype value = 1;
};
template <typename T>
class data {
public:
data(datatype dt = to_datatype<T>::value) {}
};
int main() {
data<char> d{to_datatype<int16_t>::value};
}
使用(几乎)最新的 MSVC 编译时
> cl .\test.cpp /std:c++latest /permissive-
Microsoft (R) C/C++ Optimizing Compiler Version 19.24.28314 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
test.cpp
.\test.cpp(16): error C2039: 'value': is not a member of 'to_datatype<T>'
with
[
T=char
]
.\test.cpp(16): note: see declaration of 'to_datatype<T>'
with
[
T=char
]
.\test.cpp(20): note: see reference to class template instantiation 'data<char>' being compiled
这是MSVC的错误吗?如果是,C++ 标准中的哪个术语最能描述它?
如果您将部分代码替换为
template <typename T>
class data {
public:
data(datatype dt) {}
data() : data(to_datatype<T>::value) {}
};
无论如何它编译顺利。
解决方案
我会说 MSVC 不接受代码是错误的。
根据C++17标准最终草案的[dcl.fct.default]/5,在类模板的成员函数的默认参数中的名称查找是根据[temp.inst]中的规则进行的。
根据[temp.inst]/2类模板的隐式实例化不会导致成员函数的默认参数的实例化,并且根据[temp.inst]/4的成员函数的默认参数(非显式特化a) 类模板在被调用使用时被实例化。
在您的代码中没有使用默认参数的调用to_datatype<T>::value
,因此不应实例化它。因此,不应该有关于查找失败的value
错误to_datatype<char>
。
(C++11 标准最终草案中的相关部分有相同的措辞,除了编号,参见[decl.fct.default]/5、[temp.inst]/1和[temp.inst]/3代替。)
推荐阅读
- java - SpringBoot的异步处理如何返回自定义错误页面
- node.js - 如何添加到集合顶部/从集合底部删除(猫鼬)?
- c# - 使用选择元素 ASP.NET Core MVC 中的属性保存父项和子项
- python - 在 Flask-sqlalchemy 中按订单号在 db 中对数据进行排序
- jitsi - 如果主持人设置了会议密码,Jibri 将无法录制
- python-3.x - 算法 python3 时间效率
- python - 根据条件在列中查找值
- c# - 我如何进行异步数字排序应用程序 WPF
- javascript - 为什么我不能让我的页面附加文本并出现在我的 HTML 页面上?
- c - Visual Studio 中的 ASCII 字符看起来很奇怪