Как понять пункт 8 expr.const.cast в стандарте C ++ N3337? - PullRequest
0 голосов
/ 03 ноября 2018

In C ++ черновой стандарт N3337 сечение [expr.const.cast] / 8 :

Следующие правила определяют процесс, известный как отбрасывание константности. В этих правилах T n и X n представляют типы. Для двух типов указателей:

X1 - T1 cv 1,1 * ⋯ cv 1, N *, где T1 - не указатель типа

X2 - T2 cv 2,1 * ⋯ cv 2, M *, где T2 - не указатель типа

K мин ( N , M )

приведение от X1 к X2 сбрасывает константу, если для не указателя типа T не существует неявного преобразования (пункт conv ) из:

T cv 1, ( NK + 1) * cv 1, ( NK + 2) * ⋯ cv 1, N *

до

T cv 2, ( MK + 1) * cv 2, ( MK + 2) * ⋯ cv 2, M *

Я не могу понять это предложение, поэтому я искал соответствующее предложение в C ++ проекте стандарта N4659 , [expr.const.cast] / 7 :

Преобразование из типа T1 в тип T2 отбрасывает константность, если T1 и T2 различны, существует cv-разложение T1, приводящее к n, так что T2 имеет cv-разложение в форме

резюме 0 2 P 0 2 cv 1 2 P 1 2 cv n- 1 2 P n-1 2 cv n 2 U 2

и нет преобразования квалификации, которое преобразует T1 в

CV 0 2 P 0 1 CV 1 2 P 1 1 cv n- 1 2 P n-1 1 cv n 2 U 1 .

Но я все еще не могу понять отношения между T1,T2 и T. Помогите, кто может истолковать это предложение?

1 Ответ

0 голосов
/ 27 декабря 2018

В старой версии (в основном) произвольный T введен только для того, чтобы обойти проблему, которая

const int *p=0;
auto q=reinterpret_cast<char*>(p);  // error: casts away constness

меняется с int на char. Это эффективно переписано как

auto __q=reinterpret_cast<const char*>(p);  // ok
char *q=__q;  // error

Более новая версия просто явно использует U1 вместо изобретения T .

...