// g++ 7.3
template<typename T>
struct td;
int main()
{
int a = 1;
td<decltype((const int)a)> t1;
td<decltype((const int)1)> t2;
return 0;
}
以下是编译的输出:
错误:汇总‘td<int> t1’
类型不完整且无法定义
错误:汇总‘td<const int> t2’
类型不完整且无法定义
那么,为什么decltype((const int)a)
和decltype((const int)1)
的类型不同?
答案 0 :(得分:5)
说明符decltype((const int)a)
和decltype((const int)1)
都解析为int
。这是因为没有{class 1}}非类型的prvalues,如C ++ 17 [expr]中所述:
如果prvalue最初具有类型
const
,其中cv T
是cv非限定的非类非数组类型,则表达式的类型先调整为T
任何进一步的分析。
您的输出可能只是诊断消息中的错误。要确认编译器错误,您可以编写一些代码,其行为因decltype结果而异,例如:
T
应该成功编译。
答案 1 :(得分:3)
不是答案,只是附加数据。
以下代码,
template< class Type > struct T{ Type x; };
int main()
{
int a = 1;
T<decltype((const int)a)> t1; t1.x = 1;
T<decltype((const int)1)> t2; t2.x = 2;
}
...使用Visual C ++ 2017进行干净编译,但不能使用MinGW g ++ 7.2.0编译:
[P:\temp] > g++ foo.cpp foo.cpp: In function 'int main()': foo.cpp:7:31: error: use of deleted function 'T<const int>::T()' T<decltype((const int)1)> t2; t2.x = 2; ^~ foo.cpp:1:31: note: 'T<const int>::T()' is implicitly deleted because the default definition would be ill-formed: template< class Type > struct T{ Type x; }; ^ foo.cpp:1:31: error: uninitialized const member in 'struct T<const int>' foo.cpp:1:39: note: 'const int T<const int>::x' should be initialized template< class Type > struct T{ Type x; }; ^ foo.cpp:7:42: error: assignment of read-only member 'T<const int>::x' T<decltype((const int)1)> t2; t2.x = 2; ^ [P:\temp] > _
这表示g ++编译器错误。