Как можно применить const к типам аргументов шаблона вне списка параметров в C ++? - PullRequest
5 голосов
/ 12 апреля 2019

Я изучаю шаблоны C ++, и я застрял, думая о взаимодействии между const и типами, которые являются аргументами функций шаблона.В частности, я думаю о том, как консты взаимодействуют с типами шаблонов при применении вне списка параметров шаблона.

Я пытался искать это взаимодействие в C ++ Primer 5th ed (Lippman) и в стандарте C ++ 11черновик, но const в этом контексте либо явно не упоминается, либо (в случае стандарта) довольно сложен в своем описании (я все еще новичок в C ++).

Вот пример кода моегоПроблема:

template<typename T>
const T & constify(T & t) {
    return t;
}

...

int* i = 0x12345678; 
constify(i);

У меня есть два разных ожидания типа возвращаемого значения:

  1. Выведенный тип возвращаемого значения - const (int *) &, т.е. const применяется впоследствии, поэтому мы не можемизмените указатель int, но мы можем изменить то, на что он указывает.
  2. Выведенный тип возвращаемого значения - const int * &, т.е. все деклараторы и квалификаторы применяются сразу, а не как в 1. Здесь мы больше не можемизмените целое число, на которое указывает целое число, но мы можем изменить и сам указатель.

Для меня первое имеет больше смысла, поскольку оно имеетестественное «подобное замене» правило, стоящее за ним, подобное typedef.Но мой вопрос таков;какой из них (если есть) является правильным и почему?

Ответы [ 3 ]

8 голосов
/ 12 апреля 2019

Подстановки шаблонных типов не являются текстовыми, поэтому не думайте о них с точки зрения определения текстового типа.

В вашем примере T выводится как int * - назовем его intptr.Вы делаете const ссылку на него, поэтому возвращаемое значение становится const intptr&.Это означает, что сам указатель не может быть изменен с помощью этой ссылки, но значение, на которое он указывает, может быть изменено.

Последнее, но не менее важное, вы могли бы легко проверить свои предположения, прежде чем задавать вопрос:)

5 голосов
/ 12 апреля 2019

1-й верен, и тип возвращаемого значения будет int * const &, то есть ссылка на const указатель на неконстантный int; не const int * &, т.е. ссылка на неконстантный указатель на const int.

const указывается для самого T, когда T является указателем const T будет указателем const, но не указателем на const pointee.

3 голосов
/ 12 апреля 2019

const соответствует расположение справа от типа.Некоторые объявления, такие как переменные, также позволяют ставить const слева, а другие, например определения функций-членов, разрешают только const справа.

Если вы всегда ставите / применять const направильно, это поможет вам думать об этом правильно.По этой причине многие библиотеки повышения ставят const справа.

constify яблоки const справа, следовательно, он превращает T, то есть int* в int* const - aпостоянный указатель на непостоянный int.И примените ссылку справа от этого: int* const&.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...