不同类型的`decltype((const int)a)`和`decltype((const int)1)`

时间:2018-05-28 04:23:18

标签: c++ type-conversion decltype

// 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)的类型不同?

2 个答案:

答案 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 ++编译器错误。