Возьмите следующий фрагмент кода:
#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;
};