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

#c

Вопрос:

 void p(const char(amp;a)[5]) {
  std::cout << type_name<decltype(a)>() << std::endl;
}
 

Я понимаю, что p(«abc») будет работать.
что, если бы я сделал такой шаблон

 template <typename T>
void p(Tamp; a) {
  std::cout << type_name<decltype(a)>() << std::endl;
}
 

Если бы я сделал то же самое, что и p(«abc»), тогда что было бы T? так как a окружен скобкой p(const char(amp;a)[5]) Я в замешательстве.

Комментарии:

1. Вы можете вызвать ошибку компиляции, чтобы компилятор сообщил вам — In instantiation of 'void p(Tamp;) [with T = const char [4]]' — live — godbolt.org/z/7dWMjrd7n

2. замена T на const char [4] приведет к аннулированию p(const char [4] и a), но это приведет к ошибке компиляции

3. void p(Tamp; a) { std::cout << имя типа<тип(a)>() <тип(a)><

4. Эй, добро пожаловать в Stack Overflow! Когда вы получаете ошибку, которую не ожидали, вы, как правило, должны опубликовать саму ошибку вместе со всем, что в ней упоминается, что вы написали. Если вы можете разместить простой репродуктор на веб-сайте, таком как godbolt, и связать его здесь, еще лучше!

5. Вы не можете определить тип с помощью подстановки строк. Если T это «массив из четырех const char s» ( const char[4] ), Tamp; это «ссылка на массив из четырех const char s» ( const char(amp;)[4] ). Совершенно другая проблема заключается в том, что вы не можете привязать временную ссылку к неконстантной ссылке. Однако это не имеет ничего общего с шаблонами.