$14.3.2 - "... 非型、非テンプレートのテンプレート パラメータのテンプレート引数は、次のいずれかになります。
...静的な保存期間と外部リンケージまたは内部リンケージを持つオブジェクト、または外部リンケージまたは内部リンケージを持つ関数のアドレスを指定する定数式 (5.19)..."
以下に示すコードでは、'name2' と 'name3' が非型テンプレート引数として許可されていない理由がわかりません。Windows で gcc 4.7.2 を使用しています。
「name2」と「name3」はどちらも配列の名前であるため、定数式です。さらに、「name2」には内部リンケージがあり、「name3」には静的リンケージと内部リンケージの両方があります。
template<char const *p> void f()
{
}
char name1[] = "Hi";
static char name2[]= "Hi";
const static char name3[]= "Hi";
char *name4 = "Hi";
int main()
{
f<name1>();
f<name2>();
f<name3>();
f<name4>();
}