Подтвердить что ты не робот

Любопытный случай со ссылками и статическими членами класса

Возьмите следующий фрагмент кода:

#include <type_traits>
#include <iostream>

template <class T>
void print(T &&t){
    std::cout << t << std::endl;
}

template<class T, T val>
struct Foo{
    static constexpr T value = val;
};

int main(){
    print(Foo<int, 123>::value);
}

Он отказывается компилироваться под Clang 3.3 и GCC 4.8.1 ("undefined reference to Foo<int, 123>::value"), что меня озадачивает, потому что Foo делает то же самое, что и std::integral_constant, и тот же код отлично работает с integral_constant. Он также терпит неудачу с простой ссылкой lvalue в функции печати. Любое объяснение этого поведения?

Проблема также присутствует в этом весьма минимальном примере:

template<class T>
struct Bar{
    static const bool value = true;
};
4b9b3361

Ответ 1

Как компилятор говорит, нет ссылки на статическую переменную, вы должны добавить

template<class T, T val>
constexpr T Foo<T, val>::value;

после определения класса Foo