以下代码可以使用gcc和clang(以及许多其他C++11编译器)进行编译。
当使用(几乎)最新的MSVC进行编译时。
这是MSVC的一个bug吗?如果是,C++标准中哪个术语最能描述它?
如果你用以下代码替换部分代码:
#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的一个bug吗?如果是,C++标准中哪个术语最能描述它?
如果你用以下代码替换部分代码:
template <typename T>
class data {
public:
data(datatype dt) {}
data() : data(to_datatype<T>::value) {}
};
无论如何,它都可以顺利编译。
data
不是聚合类型,因为它具有用户提供的构造函数。根据链接名称,引用的问题是代码生成问题,而不是前端问题,这会导致编译错误,就像这里一样。我已经在下面发布了一个答案来回答这个问题。这里的问题是默认参数是否应该被实例化。如果它被实例化,那么错误消息是正确的。否则就不是。 - walnut