Почему я могу объявить константную ссылку, используя псевдоним типа? - PullRequest
0 голосов
/ 31 января 2019

У меня простой вопрос: как я знаю, я могу объявить указатель const на некоторый тип данных или указатель на постоянный тип данных, но я могу только объявить ссылку только на постоянный тип данных и не указывать постоянную ссылку на тип данных;тот факт, что ссылка уже является константой, потому что она не может быть связана с другим объектом.

Так что, когда я пытаюсь создать const ref to someDataType, я получаю ошибку во время компиляции.Но то, что имеет значение для меня, - это когда используется type alias с использованием typedef или using.Например:

#include <iostream>

int main() {

    int i{ 10 };
    //  int& const r1{ i }; // error: ‘const’ qualifiers cannot be applied to ‘int&’. Ok here.
    using rInt = int&; // or typedef int& rInt;
    const rInt r2{ i }; // why const is allowed here?
    ++r2; // this proves that the const is applied to the reference not to the object referred to.

    std::cout << r2 << std::endl; // 11

}

Как вы можете видеть выше, я могу добавить const к ссылке, которая, на мой взгляд, является избыточной в этом контексте.Но почему C ++ допускает это с псевдонимами типов, но не напрямую?

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Это тот случай, когда здравый смысл вступает в игру.Поскольку ссылки не могут быть переназначены, они действуют так, как если бы они были const.Добавление const к ссылочной декларации ничего не добавляет, и поэтому T & const является запрещающим для [dcl.ref] / 1

[...] Cv-качественные ссылки плохо сформированы, за исключением случаев, когда cv-квалификаторы вводятся посредством использования typedef-name ([dcl.typedef], [temp.param]) или спецификатора decltype ([dcl.type.simple]),в этом случае квалификаторы cv игнорируются.

Однако вы заметите, что это разрешено, тогда ссылка является typedef-name или decltype-specier .Так что если T равно T&, то const игнорируется.Если бы это было не так, это усложнило бы общее программирование.

0 голосов
/ 31 января 2019

Поскольку в стандарте говорится так:

[dcl.ref] ... Cv-квалифицированные ссылки некорректны, за исключением случаев, когда cv-квалификаторы вводятся посредством использования typedef-name([dcl.typedef], [temp.param]) или спецификатор decltype ([dcl.type.simple]), в этом случае cv-квалификаторы игнорируются

Это похоже на то, какВы не можете объявить ссылочную ссылку, хотя это возможно с помощью typedef (где ссылки сворачиваются в одну):

int i;
int& iref = i;
//int& & irefref = iref; // not OK
using Iref = int&;
Iref& iretypedef = iref; // OK; collapses into int&

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

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