据我所知,decltype不允许使用已删除的构造函数:
struct no_def
{
no_def() = delete;
};
void test()
{
decltype(no_def()) a{}; //error: use of deleted function ‘no_def::no_def()’
}
但如果我制作模板“test”函数,它将编译
template<typename...>
void test()
{
decltype(no_def()) a{}; //OK
}
它也是
template<typename...>
void test()
{
decltype(no_def("not", "defined", "constructor")) a{}; //OK
}
有人可以解释一下吗?
答案 0 :(得分:4)
这显然是海湾合作委员会的一个错误。最新的Clang和最新的Visual C ++都能正确打印诊断消息。
锵:
error: call to deleted constructor of 'no_def'
Visual C ++:
error C2280: 'no_def::no_def(void)': attempting to reference a deleted function
您可以在https://godbolt.org/处自行测试。
请注意,为了验证错误,您应该简化模板,调用函数,并删除干扰您感兴趣的输出的未使用变量警告:
struct no_def
{
no_def() = delete;
};
template<typename T>
void test()
{
decltype(no_def()) a{}; // error in Clang and MSVC, no error in GCC
a = a; // get rid of warning
}
int main()
{
test<int>();
}