Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: dcthxdОтветов: 1

В разделе проект стандарта 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+2) *⋯ cv1,Н *

to

T cv2,(M-K+1) * cv2,(M-K+2) *⋯ cv2,M *

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

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

cv02P02 cv12P12 ⋯ cvn-12Pn-12 cvn2 U2

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

cv02P01 cv12P11 ⋯ cvn-12Pn-11 cvn2 U1.

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

c++c++17c++11const-cast

Ответы

Ответ 1 · рейтинг 1 · Davis Herring

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы