Почему мы не можем повторно использовать идентификатор шаблона псевдонима с другими параметрами шаблона? - PullRequest
1 голос
/ 10 февраля 2020

Возьмем следующий пример (https://godbolt.org/z/ouX3Vz):

template<typename T>
using A = T;

template<typename T, typename V>
using A = V; // Why is this not allowed?

template<typename T>
void B() {}

template<typename T, typename V>
void B() {} // Yet this is allowed?

int main() {
    A<int> hello = 10; // Allowed, T=int
    A<double> world = 20.0; // Allowed, T=double
    // A<int, int> bad = 20; // Not allowed, T=int, V=double?

    B<int>();
    B<int, int>();
}

Нам разрешено иметь два функциональных шаблона для B, поскольку параметры различаются, однако мы не являемся разрешено иметь два шаблона псевдонимов для A, несмотря на различные параметры.

Это упущение в стандарте или есть логическое обоснование, которое я пропускаю? Есть ли ссылки на стандарт, описывающий это поведение?

1 Ответ

3 голосов
/ 10 февраля 2020

Вам разрешено определять несколько шаблонов функций с одинаковыми именами, поскольку функции могут быть перегружены друг с другом. Если функциям было разрешено перегрузить, а шаблонам функций - нет, то это стало бы серьезным препятствием на пути использования шаблонов.

Не было необходимости разрешать нескольким шаблонам классов в одной и той же области иметь одно и то же имя. , поскольку существует не так много вариантов использования такой функции, которые еще не решены одним шаблоном variadi c, и это усложнит язык. (Рассмотрим, например, невозможность позднее ссылаться на один конкретный шаблон из набора.) Аналогичное утверждение применяется к шаблонам псевдонимов.

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