निम्नलिखित कोड वैध है?
template <int N>
class foo {
public:
constexpr foo()
{
for (int i = 0; i < N; ++i) {
v_[i] = i;
}
}
private:
int v_[N];
};
constexpr foo<5> bar;
क्लैंग इसे स्वीकार करता है, लेकिन जीसीसी और एमएसवीसी इसे अस्वीकार करते हैं।
जीसीसी की त्रुटि है:
main.cpp:15:18: error: 'constexpr foo<N>::foo() [with int N = 5]' called in a constant expression
15 | constexpr foo<5> bar;
| ^~~
main.cpp:4:15: note: 'constexpr foo<N>::foo() [with int N = 5]' is not usable as a 'constexpr' function because:
4 | constexpr foo()
| ^~~
main.cpp:4:15: error: member 'foo<5>::v_' must be initialized by mem-initializer in 'constexpr' constructor
main.cpp:12:9: note: declared here
12 | int v_[N];
| ^~
यदि इस तरह का कोड ठीक था, तो मैं index_sequence
एस के कुछ उपयोगों में कटौती कर सकता था ।
_v
सी + + 17 तक आरंभीकरण सूची में आरंभ किया जाना चाहिए। शायद C ++ 20 में कुछ बदला गया है।
int
सदस्य के पढ़े जाने का कभी भी अनुचित व्यवहार नहीं होगा। "। मुझे आश्चर्य है कि क्या जीसीसी ऐसा नहीं कर रहा है जो आज्ञाकारी है, या आसपास का अन्य तरीका ...