Date
2013-09-24.00:00:00
Message id
4603

Content

N3690 comment CA 15

According to 13.10.3.6 [temp.deduct.type] paragraph 17,

If, in the declaration of a function template with a non-type template-parameter, the non-type template-parameter is used in an expression in the function parameter-list and, if the corresponding template-argument is deduced, the template-argument type shall match the type of the template-parameter exactly, except that a template-argument deduced from an array bound may be of any integral type.

This does not cover return types, leaving the outcome of an example like the following unclear:

  template <int N> struct A;

  template <short N>
  A<N> *foo();

  void bar() {
    A<1> *(*fp)(void) = &foo;
  }