Как понять пункт 8 expr.const.cast в стандарте С++ N3337?

В разделе проект стандарта C++ N3337 [expr.const.cast]/8:

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

X1 равно T1 cv1,1 * ⋯ cv1,N * где T1 не является указателем

X2 равно T2 cv2,1 * ⋯ cv2,M * где T2 не является типом указателя

K — мин. (N,M)

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

T cv1,(N-K+1) * cv1,(N-K< /em>+2) *⋯ cv1,Н *

to

T cv2,(M-K+1) * cv2,(M-K< /em>+2) *⋯ cv2,M *

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

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

cv02P02 cv12P12 cvn-12Pn-12 < em>cvn2 U2

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

cv02P01 cv12P11 cvn-12Pn-11 < em>cvn2 U1.

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


person dcthxd    schedule 03.11.2018    source источник


Ответы (1)


В более старой версии вводится (в основном) произвольное 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.

person Davis Herring    schedule 26.12.2018