Код: Выделить всё
#include
struct X { };
struct Y : X { };
int main() {
using CY = const Y;
true ? X() : CY(); // error: different types 'X' and 'const Y'
}
< /code>
Вот правило из стандартного черновика C ++ 20, которое, я думаю, должно применяться в этом случае: < /p>
7.6 .16 Условный оператор [expr.cond]
...
(4.3.3.2) В противном случае, если T2 является базовым классом T1, целевой тип CV1 T2 , где CV1 обозначает CV-квалификаторы
of T1,
...
< /blockquote>
где t2 < /код > будет x
7.6.16 Условный оператор [expr.cond]
...
Используя этот процесс, определяется, может ли быть сформирована неявная последовательность преобразования со второго операнда
до целевого типа, определенного для третьего операнда, и наоборот.
...
< /blockquote>
завершит это: < /p>
using CX = const X;
true ? CX() : CY(); // compiles
true ? CX() : Y(); // even this compiles
true ? X() : CY(); // according to the rule becomes:
// true ? 'type X here' : 'type const X here'
// which should compile, but doesn't
< /code>
Каждый комментарий есть правда для любого компилятора, что заставляет меня думать, что я где -то ошибается. Но другая возможность состоит в том, что у каждого компилятора ошибка, потому что?: Оператор не так важен, но Idk.
Подробнее здесь: https://stackoverflow.com/questions/794 ... snt-compil