So che ci sono molte domande simili, ma domande in qualche modo diverse. Si tratta di circa la seguente situazione:Assegna un membro statico della classe constexpr alla variabile di runtime
#include <iostream>
#include <array>
template<typename T> class MyClass
{
public:
static constexpr std::array<T,4> ARRAY {{4, 3, 1, 5}};
};
int main()
{
constexpr std::array<int, 4> my_array(MyClass<int>::ARRAY); // works fine -> can use the ARRAY to initialize constexpr std::array
constexpr int VALUE = 5*MyClass<int>::ARRAY[0]; // works also fine
int value;
value = my_array[0]; // can assign from constexpr
value = MyClass<int>::ARRAY[0]; // undefined reference to `MyClass<int>::ARRAY
std::cout << VALUE << std::endl;
std::cout << value << std::endl;
return 0;
}
Per quanto ho capito constexpr
è per le costanti in fase di compilazione. Quindi il compilatore può fare già qualche calcolo, ad esempio per calcolare lo VALUE
. Inoltre posso ovviamente definire uno constexpr std::array<,>
, da cui posso assegnare i valori alle variabili di runtime. Mi aspetto che il compilatore imposti già value = 4
nel programma eseguibile, per evitare un'operazione di caricamento. Tuttavia, non posso assegnare direttamente dal membro statico, ottenendo l'errore
undefined reference to `MyClass<int>::ARRAY'
clang-3.7: error: linker command failed with exit code 1
che non ha senso per me, perché può essere fatto con una fase intermedia di un'altra variabile constexpr
.
Quindi la mia domanda è: perché un membro statico di constexpr di una classe non può essere assegnato a una variabile di runtime?
Nota: nella mia MWE la classe è una classe modello, che non influisce sull'errore. Tuttavia, inizialmente ero interessato a questo caso particolare, che mi aspetto essere più generale come per una classe non modello.
(compilatore è clang++
o g++
con -std=c++11
- danno lo stesso errore)
Edit: @Bryan Chen: Hai dimenticato le linee di uscita. Sono aggiunti ora.
'clang ++' hanno questo problema: http://coliru.stacked-crooked.com/a/e9698f2bb249e509. Ma 'g ++' funziona: http://coliru.stacked-crooked.com/a/5ef23fe29b0aaa28. Bug clang? –
VS2015 dice questo: 'l'inizializzazione in classe per il tipo 'const std :: array' non è stata ancora implementata; il membro statico rimarrà non inizializzato in fase di esecuzione ma è supportato l'uso in espressioni costanti. Potresti imbatterti in qualcosa di simile. –
@Bryan: ero poco preciso. Ho installato g ++ 4.8.5, che non supporta ancora C++ 14. Ma mi aspettavo che funzionasse già per C++ 11 !? – marlam