// 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;
}
Below is the output of compilation:
error: aggregate ‘td<int> t1’
has incomplete type and cannot be defined
error: aggregate ‘td<const int> t2’
has incomplete type and cannot be defined
So, why are the types of decltype((const int)a)
and decltype((const int)1)
different?
The specifiers decltype((const int)a)
and decltype((const int)1)
both resolve to int
. This is because there are no const
prvalues of non-class type, as covered in C++17 [expr]:
If a prvalue initially has the type
cv T
, whereT
is a cv-unqualified non-class, non-array type, the type of the expression is adjusted toT
prior to any further analysis.
Your output might just be a bug in the diagnostic message. To confirm a compiler bug you could write some code whose behaviour differs depending on the decltype result, e.g.:
decltype((const int)1) x; x = 5;
which should compile successfully.
Not an answer, just additional data.
The following code,
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;
}
… compiles cleanly with Visual C++ 2017, but not with 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] > _
This indicates a g++ compiler bug.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With