Я пытаюсь понять, как работают шаблоны переменных в следующем примере:
#include <iostream>
template <class T, const T& t>
int var = t.a;
struct T
{
int a;
constexpr T(): a(31){ }
};
T y;
const T t = y;
const T tt = T();
int main()
{
std::cout << "var <T, t> = " << var<T, t> << std::endl; //0
std::cout << "y.a = " << y.a << std::endl; //31
std::cout <<"var <T, tt> = " << var<T, tt> << std::endl; //31
}
Честно говоря, я действительно не знаю об этом поведении. Меня смутило то, что специализация var<T, t>
равна 0, но y.a
- 31
. Кроме того, если мы инициализируем объект типа T
временным, мы также имеем разные результаты. Не могли бы вы немного уточнить это?
Я имею в виду, я ищу нормативную ссылку из рабочего проекта N4296
, описывая это поведение.