#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/7dWMjrd7n2. замена 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]
). Совершенно другая проблема заключается в том, что вы не можете привязать временную ссылку к неконстантной ссылке. Однако это не имеет ничего общего с шаблонами.