Ответ 1
В настоящий момент переменные шаблоны довольно неопределенны. Если мы перейдем к текущему списку основных проблем, мы увидим, что
- Неясно, можно ли несколько раз определять шаблон переменной в программе.
- Неясно, как согласованы определения и объявления переменных шаблонов.
- Неясно, как должны работать переменные шаблонные частичные специализации.
- Неясно, какова точка создания специализированной специализации по шаблону.
Также было непонятно, какие шаблоны переменных порядка инициализации следуют. CWG issue 1744 изменен [basic.start.init]/p2, чтобы уточнить, что
Динамическая инициализация нелокальной переменной со статическим хранилищем длительность неупорядочена, если переменная неявно или явно созданная специализация, и в противном случае упорядочивается [Примечание: явно специализированный статический элемент данных или переменная Специализация шаблона заказала инициализацию. -end note].
var<T, t>
- нелокальная переменная со статической продолжительностью хранения, которая является неявно созданной специализацией. Поэтому его динамическая инициализация неупорядочена. Поскольку t
не подходит для постоянной инициализации, это означает, что var<T, t>
может быть инициализирован до динамической инициализации t
, в результате чего получается 0 независимо от относительного порядка между определением var
и t
определение и независимо от точки инстанцирования var<T, t>
.
Таким образом, переводит определение var
ниже определения t
и/или явное инстанцирование var<T, t>
не влияет на то, что печатается, а , предоставляя явную специализацию для var<T, t>
, все еще инициализируя ее до t.a
, приводит к тому, что первая строка print 31
.