पर स्थैतिक constexpr क्लास सदस्य असाइन करें मुझे पता है कि बहुत सारे प्रश्न हैं, लेकिन किसी भी तरह से अलग प्रश्न हैं। यह निम्न स्थिति के बारे में है:रनटाइम वैरिएबल
#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;
}
जहां तक मेरा constexpr
समझने के संकलन समय स्थिरांक के लिए है। तो संकलक पहले से ही कुछ गणना कर सकता है, उदाहरण के लिए VALUE
की गणना करने के लिए। इसके अलावा मैं स्पष्ट रूप से constexpr std::array<,>
परिभाषित कर सकता हूं, जिससे मैं रनटाइम चर के मानों को असाइन कर सकता हूं। मैं उम्मीद करता हूं कि लोडर ऑपरेशन से बचने के लिए कंपाइलर को पहले से ही value = 4
निष्पादन योग्य प्रोग्राम में सेट करना होगा। हालांकि, मैं स्थिर सदस्य से सीधे असाइन नहीं कर सकते,, त्रुटि
undefined reference to `MyClass<int>::ARRAY'
clang-3.7: error: linker command failed with exit code 1
जो मेरे लिए कोई मतलब नहीं है हो रही है क्योंकि इसे किसी अन्य constexpr
चर का एक मध्यवर्ती कदम के साथ किया जा सकता है।
तो मेरा सवाल यह है कि: किसी क्लास का एक स्थिर कॉन्स्टेक्स सदस्य किसी रनटाइम चर को असाइन क्यों नहीं किया जा सकता है?
नोट: मेरे MWE में कक्षा एक टेम्पलेट वर्ग है, जो त्रुटि को प्रभावित नहीं करती है। हालांकि, मैं मूल रूप से इस विशेष मामले में रूचि रखता था, जिसे मैं एक गैर-टेम्पलेट वर्ग के रूप में अधिक सामान्य होने की उम्मीद करता हूं।
(संकलक clang++
या g++
-std=c++11
साथ है - वे एक ही त्रुटि दिखा सकते हैं)
संपादित करें: @Bryan चेन: उत्पादन लाइनों भूल। अब जोड़ा गया है
'clang ++ 'में यह समस्या है: http://coliru.stacked-crooked.com/a/e9698f2bb249e509। लेकिन 'जी ++' काम करता है: http://coliru.stacked-crooked.com/a/5ef23fe29b0aaa28। क्लैंग बग? –
वीएस2015 यह कहता है: 'टाइप के लिए कक्षा में प्रारंभिक' कॉन्स्ट std :: array 'अभी तक कार्यान्वित नहीं किया गया है; स्थिर सदस्य रनटाइम पर अनियंत्रित रहेगा लेकिन स्थिर-अभिव्यक्तियों में उपयोग समर्थित है। आप कुछ इसी तरह से चल रहे हो सकता है। –
@ ब्रायन: मैं निर्दोष था। मेरे पास g ++ 4.8.5 इंस्टॉल है, जो अभी तक C++ 14 का समर्थन नहीं करता है। लेकिन मुझे उम्मीद है कि यह पहले से ही सी ++ 11 के लिए काम करेगा !? – marlam