Created on 2022-06-16.00:00:00 last changed 1 week ago
It is not clear whether a defaulted consteval function is still an immediate function even if it is not a valid constexpr function. For example:
template <typename Ty> struct A { Ty n; consteval A() {} }; template <typename Ty> struct B { Ty n; consteval B() = default; }; A<int> a; B<int> b;
The declarations of a and b should both fail due to an uninitialized member n in each of A and B. The = default; should not make a difference. However, there is implementation divergence. We should be able to lean on 7.7 [expr.const] bullet 5.5 to handle this when the immediate invocation is required.
Possible resolution:
Change in 9.2.6 [dcl.constexpr] paragraph 7 as follows:
If the instantiated template specialization of a constexpr templated functiontemplate or member function of a class templatewould fail to satisfy the requirements for a constexpr function, that specialization is still a constexpr function, even though a call to such a function cannot appear in a constant expression. Similarly, if the instantiated template specialization of a consteval templated function would fail to satisfy the requirements for a consteval function, that specialization is still an immediate function, even though an immediate invocation would be ill-formed. If no specialization of the template would satisfy the requirements for a constexpr or consteval function when considered as a non-template function, the template is ill-formed, no diagnostic required.
History | |||
---|---|---|---|
Date | User | Action | Args |
2022-06-16 00:00:00 | admin | create |