Редактировать: Нет, это не правильно. См. @ ответ Корнеля .
Я не совсем уверен, но, посмотрев "Страуструп" "Язык программирования C ++", я думаю, что причина в разделе 13.8.4 Приложения C может быть .
Поскольку frob
является шаблоном, можно было бы специализировать его для i=0
в точке после его вызова. Это означает, что для реализации оставалось бы два возможных способа выбора, который frob
вызывать так, как кажется, что он может выбрать его в момент создания или в конце обработки единицы перевода.
Итак, я думаю, проблема в том, что вы могли бы сделать
namespace ns {
struct foo {};
template<int i> void frob(foo const&) {}
}
int main() {
ns::foo f;
frob<0>(f);
return 0;
}
namespace ns {
template<> void frob< 0 >(foo const&) { /* Do something different*/ }
}