Предупреждение для const в typedef - PullRequest
       24

Предупреждение для const в typedef

4 голосов
/ 11 сентября 2011

Когда я компилировал программу на C ++ с использованием icc 11, он выдал следующее предупреждение:

предупреждение # 21: в этом объявлении не указываются квалификаторы типа
typedef const direction_vector_ref_t direction_vector_cref_t;

Это говорит const просто бессмысленно.Мне любопытно, потому что, если этот typedef расширится, он превратится в const array<double,3>&, а const определенно имеет смысл.Почему он дал это предупреждение?

Ответы [ 2 ]

6 голосов
/ 11 сентября 2011

direction_vector_ref_t, я нажимаю, это ссылка.Ссылки являются константными по дизайну, поэтому добавлять const к ссылке не имеет смысла.Вероятно, вы захотите сделать ссылку на const-объект, чего не может сделать typedef.Вам придется повторить слегка измененное определение typedef.

Просто чтобы уточнить:

typedef T& ref;
typedef const T& cref;
typedef const ref cref;

Последняя строка такая же, как первая, а не вторая.Определение типа не является вставкой токена, после того, как вы введете определение T & как ref, ref ссылается на ссылку на тип T.Если вы добавите const к нему, то получите константную ссылку на тип T, а не ссылку на константный тип T.

4 голосов
/ 11 сентября 2011

Ты уверен? Попробуйте:

array<double, 3> a;
direction_vector_cref_t b = a;
b[0] = 1.0;

Проблема здесь в том, что когда вы используете typedef, он концептуально добавляет круглые скобки вокруг типа, так что вы концептуально используете const (array<double, 3>&) вместо (const array<double, 3>)&, поэтому вы фактически не делаете константу референтного объекта постоянной. Таким образом, ваша декларация больше похожа на:

typedef array<double, 3>& const direction_vector_cref_t;

И в приведенном выше случае const для переменной (а не тип референта) должен быть отложен на более поздний срок.

...