Можно ли изменить шаблон переменной?

Сегодня кто-то подарил мне код следующей формы:

#include <iostream>

namespace example {
    template <typename T>
    T variable_template = T(42);
}

int main() {
    example::variable_template<int> = 10;
    std::cout << example::variable_template<int> << std::endl;
}

Вы можете увидеть его здесь: http://coliru.stacked-crooked.com/a/3a786c42b5204b0a

Я ожидал, что этот код напечатает 42, так как 10, кажется, назначен временному. Внутри пространства имен существует шаблон только объявления (не экземпляра), так что нет никаких данных для изменения внутри пространства имен. Несмотря на это, он удивил меня и вместо этого напечатал 10.

Я бы также ожидал предупреждения о назначении временного, но этого также не произошло.

Это неопределенное поведение, мое понимание шаблонов неверно, или что-то еще происходит?

1 ответ

Решение

Внутри пространства имен существует шаблон только объявления (не экземпляра), так что нет никаких данных для изменения внутри пространства имен.

Не так!

[C++14: 14.7.2/6]: Явное создание экземпляра класса, шаблона функции или шаблона переменной помещается в пространство имен, в котором определяется шаблон. [..]

Когда у вас есть шаблон класса Foo и обратитесь к экземпляру (скажем, Foo<int>), этот экземпляр существует так же, как обычный класс, с той же областью действия, что и шаблон.

С переменными шаблонами нет ничего особенного. Когда вы ссылаетесь на example::variable_template<int> вы "добавляете" эту переменную в область, содержащую шаблон.

Ваше пространство имен example затем содержит переменную с именем variable_template<int> ,


Я бы также ожидал предупреждения о назначении временного, но этого также не произошло.

Здесь нет временных времен, кроме T(42),

Другие вопросы по тегам