Понимание const внутри шаблона - PullRequest
0 голосов
/ 10 марта 2019

Если вы напишите такой шаблон

template <typename T>
using X = const T;

в чем смысл const T?

Чтобы узнать об этом, я написал эту программу:

std::cout << std::boolalpha
    << std::is_same_v<X<int&>, int&> << '\n'
    << std::is_same_v<X<const int*>, const int* const> << '\n'
    << std::is_same_v<X<const int&>, const int&> << '\n';

и, к моему удивлению, все ответы были правдой.

Почему X является int &, а не const int &?

Я скомпилировал его с помощью gcc 7.3.0 и clang ++ 6.0. Тот же ответ.

Ответы [ 2 ]

4 голосов
/ 10 марта 2019

Ссылка на const int - это одно.Константная ссылка на int - это нонсенс.

По правилам C ++, когда вы задаете const для ссылки, ничего не происходит.

Это имеет большой смысл, если вы привыкли к восточному const,и мало, если вы западный пользователь const.

int const&

является ссылкой на const int.

int&const

- это то же самое, что

int&
1 голос
/ 10 марта 2019

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

typedef int& A;
const A aref = 3;   // ill-formed; lvalue reference to non-const initialized with rvalue

Тип aref - это «lvalue reference to int», а не «lvalue reference to const int». - конец примера ]

[dcl.ref] / 1

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