मैं निम्नलिखित कोड में परेशानी आ रही करने के लिए समान होने के बावजूद constexpr:नेस्टेड struct टूटता वैश्विक लोगों
template<typename T>
constexpr int get(T vec) {
return vec.get();
}
struct coord {
constexpr int get() const { return x; }
int x;
};
struct foo {
struct coord2 {
constexpr int get() const { return x; }
int x;
};
constexpr static coord f = { 5 };
constexpr static int g = get(f); // works
constexpr static coord2 h = { 5 };
constexpr static int i = get(h); // doesn't work
};
constexpr coord foo::f;
constexpr foo::coord2 foo::h;
int main(){}
अनिवार्य रूप से, get(f)
एक निरंतर अभिव्यक्ति माना जाता है, लेकिन get(h)
नहीं है। एकमात्र चीज बदल गई है कि कोई वैश्विक संरचना coord
का उपयोग करता है, जबकि दूसरा नेस्टेड स्ट्रक्चर coord2
का उपयोग करता है। Structs ' निकायों समान हैं।
ऐसा क्यों है?
जीसीसी त्रुटि:
test.cpp:20:35: error: field initializer is not constant
बजना त्रुटि:
test.cpp:20:26: error: constexpr variable 'i' must be initialized by a constant expression
constexpr static int i = get(h); // doesn't work
^ ~~~~~~
test.cpp:8:10: note: undefined function 'get' cannot be used in a constant expression
return vec.get();
^
test.cpp:20:30: note: in call to 'get({5})'
constexpr static int i = get(h); // doesn't work
^
test.cpp:13:21: note: declared here
constexpr int get() const { return x; }
@dyp: कि मैं क्या कहा नहीं है? (यह अनुमानित है, यह स्पष्ट नहीं है) –
आह, ठीक है, मैंने उस पैराग्राफ को गलत समझा, क्षमा करें। – dyp