Created on 2024-01-14.00:00:00 last changed 3 months ago
Consider:
#include <concepts> template <class T> T get(); template <class T> using X = decltype(true ? get<T const&>() : get<T>()); struct C { }; static_assert(std::same_as<X<int>, int>); static_assert(std::same_as<X<C>, C const>); // #1
Before Issue 1895, #1 was well-formed. With the reformulation based on conversion sequences, #1 is now ill-formed because both conversion sequences can be formed.
Possible resolution:
Change in 7.6.16 [expr.cond] bullet 4.3 as follows:
- ...
- If E2 is a prvalue or if neither of the conversion sequences above can be formed and at least one of the operands has (possibly cv-qualified) class type:
- if T1 and T2 are the same class type (ignoring cv-qualification):
andif T2 is at least as cv-qualified as T1, the target type is T2,- otherwise, no conversion sequence is formed for this operand;
- otherwise, if T2 is a base class of T1, the target type is cv1 T2, where cv1 denotes the cv-qualifiers of T1
,;- otherwise, the target type is the type that E2 would have after applying the lvalue-to-rvalue (7.3.2 [conv.lval]), array-to-pointer (7.3.3 [conv.array]), and function-to-pointer (7.3.4 [conv.func]) standard conversions.
History | |||
---|---|---|---|
Date | User | Action | Args |
2024-01-14 00:00:00 | admin | create |