Prendere il seguente pezzo di codice:Un caso curioso con riferimenti e membri della classe statici
#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);
}
Si rifiuta di compilare sotto Clang 3.3 e GCC 4.8.1 ("undefined reference to Foo<int, 123>::value")
, che mi lascia perplesso perché Foo
fa esattamente lo stesso di std::integral_constant
e lo stesso codice funziona perfettamente con integral_constant
. Inoltre, fallisce con un semplice riferimento di lvalue nella funzione di stampa. Qualche spiegazione riguardo questo comportamento?
Il problema è presente con questo abbastanza minimale esempio anche:
template<class T>
struct Bar{
static const bool value = true;
};
L'esempio viene compilato e eseguito [su Ideone] (http://ideone.com/BJLEuL). Forse un problema con il compilatore? – djf
Ho modificato nelle versioni del compilatore; Ideone probabilmente usa cose più vecchie. –
Ora questo è abbastanza interessante: http://www.compileonline.com lancia l'errore ma ha gcc 4.7.2 proprio come Ideone. –