i
имеет внешнюю связь, а j
- внутреннюю. Эти правила перечислены в разделе §3.5 [basic.link]
4 Безымянное пространство имен или пространство имен, объявленное прямо или косвенно в безымянном пространстве имен, имеет внутреннюю связь. Все остальные пространства имен имеют внешнюю связь. Имя, имеющее область действия пространства имен, которому не была присвоена внутренняя связь выше, имеет ту же связь, что и охватывающее пространство имен, если это имя
- переменной; или
- ...
Глобальное пространство имен имеет внешнюю связь, следовательно, i
также имеет внешнюю связь (поскольку она явно не объявлена как имеющая внутреннюю связь).
3 Имя, имеющее область пространства имен (3.3.6), имеет внутреннюю связь, если это имя
- ...
- энергонезависимой переменной, которая является явно объявленные const или constexpr, но не объявленные явно extern и ранее не объявленные как имеющие внешнюю связь; или
- ...
j
явно объявлен const
без объявления extern
, следовательно, он имеет внутреннюю связь.
Я считаю, что clang является правильным в этом случае из-за §14.3.2 / 1 [temp.arg.nontype]
аргумент-шаблон для не-типа, не шаблона параметр-шаблона должен быть одним из:
- ...
- константа выражение (5.19), которое обозначает адрес полного объекта со статической продолжительностью хранения и внешней или внутренней связью ...
j
удовлетворяет вышеуказанному требованию и должен быть разрешен как аргумент, не являющийся типом.
person
Praetorian
schedule
05.05.2014
const
с ограниченным пространством имен имеют внутреннюю связь. - person Kerrek SB   schedule 05.05.2014