2015-04-25 2 views
3

Это продолжение моего предыдущего вопроса:Может ли ссылка пересылки быть псевдонимом с шаблоном псевдонима?

Can an identity alias template be a forwarding reference?

кажется, что следующий код работает как Clang 3.7.0 (demo) и GCC 6.0.0 (demo):

template <class T> 
using forwarding_reference = T&&; 

template <class T> 
void foo(forwarding_reference<T>) {} 

int main() 
{ 
    int i{}; 
    foo(i); 
    foo(1); 
} 

Являются ли компиляторы правильными для замены шаблона псевдонима для ссылки на пересылку, и это может быть причудливым способом написания?

+1

Как это не совсем тот же вопрос с точно таким же ответом? – Barry

+3

@Barry Это не дубликат. – Axalo

+0

@MarcAndreson Это ** абсолютно ** дубликат. Возникает вопрос: может ли шаблон псевдонима быть разрешен как ссылка для пересылки? Ответ Колумба здесь предполагает, что ответ Анже на исходный вопрос неверен. Было бы лучше иметь оба ответа в одном месте, чтобы сайт мог получить ответ на этот вопрос, потому что это хороший и интересный вопрос. – Barry

ответ

3

Это действительно стандартное соответствие. §14.5.7/2:

Когда шаблон Идентификатор относится к специализации шаблона псевдонима, это эквивалентно связанного типа, полученного путем замены его шаблонов аргументов дляшаблоны-параметры в тип-идентификатор шаблон-псевдоним.

Теперь рассмотрим, что во время аргумента шаблона дедукции, только тип параметра (в терминах параметров шаблона) осматривается - §14.8.2.1/1:

Шаблон вывод аргумента делается путем сравнения каждой функции тип параметра шаблона (назовите его P) с типом соответствующего аргумента вызова (назовите его A), как описано ниже.

В соответствии с первой котировки, тип параметра, т.е. forwarding_reference<T>, эквивалентно T&&. Следовательно, P - T&&, и не может быть никакой разницы в отношении вычета.

Этот же вывод был сделан Комитетом в отчете дефектов относительно этого точного сценария, #1700:

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

+0

Спасибо, поэтому не должно быть 'identity &&' (по предыдущему вопросу)? Сначала мы разрешаем шаблон псевдонима в 'T &&', а затем выполняем вывод аргумента шаблона. Или [рассуждение Ангела] (http://stackoverflow.com/a/29851257/391022) исправить, что существует дополнительное правило, которое требует строго синтаксиса 'T &&' (независимо от того, где) рассматривать его как ссылку для пересылки? –

+0

Оба Составители утверждают, что 'недействительными Foo (идентичность &&);' 'переопределяет недействительными Foo (forwarding_reference );' –

+1

@MarcAndreson Я считаю, Angew неверно, так как 'P' определяется как *" каждой функции типа параметра шаблона (назовем его ' P') "* в 14.8.2.1/1. Это уже ** тип **, поэтому его аргумент - *" 'identity ' является типом параметра шаблона, но сам он не является параметром шаблона "* - – Columbo