Почему шаблоны не могут принимать локальные типы функций?

В C ++ нормально иметь функцию, которая принимает функцию локального типа:

int main() {
  struct S { static void M(const S& s) { } };
  S s;
  S::M(s);
}

, но не нормально иметь шаблон, который выполняет:

template void Foo(const T& t) { }

int main() {
  struct S { } s;
  Foo(s);   // Line 5: error: no matching function for call to 'Foo(main()::S&)'
}

14.3. 1 абзац 2 стандарта C ++.

Тип без связи [...] не должен использоваться в качестве аргумента шаблона для параметра типа шаблона

Почему C ++ запрещает это?


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


ps Пожалуйста, не говорите просто « это запрещено, потому что стандарт говорит, что это не »

6
задан Community 23 May 2017 в 12:01
поделиться