यह this topic के लिए कुछ प्रकार का अनुवर्ती है और इसका एक छोटा सा हिस्सा है। पिछले विषय के साथ, मान लीजिए कि हमारे कंपाइलर में constexpr
std::initializer_list
और std::array
के लिए फ़ंक्शन हैं। अब, चलिए सीधे बिंदु पर जाएं।निरंतर अभिव्यक्तियों के बारे में भ्रम
#include <array>
#include <initializer_list>
int main()
{
constexpr std::array<int, 3> a = {{ 1, 2, 3 }};
constexpr int a0 = a[0];
constexpr int a1 = a[1];
constexpr int a2 = a[2];
constexpr std::initializer_list<int> b = { a0, a1, a2 };
return 0;
}
#include <array>
#include <initializer_list>
int main()
{
constexpr std::array<int, 3> a = {{ 1, 2, 3 }};
constexpr std::initializer_list<int> b = { a[0], a[1], a[2] };
return 0;
}
यह इस त्रुटि के साथ दुर्घटनाओं:
error: 'const std::initializer_list<int>{((const int*)(&<anonymous>)), 3u}' is not a constant expression
हालांकि मैं constexpr
और निरंतर भाव इस बीच के बारे में कुछ कागजात पढ़, इस व्यवहार अभी भी मेरे लिए कोई समझ नहीं आता है। पहला उदाहरण कैसे वैध निरंतर अभिव्यक्ति माना जाता है और दूसरा नहीं? मैं किसी भी स्पष्टीकरण का स्वागत करता हूं ताकि मैं बाद में शांति में आराम कर सकूं।
नोट: मैं सटीक इसे तुरंत, बजना नहीं पहले टुकड़ा संकलन करने के बाद से यह constexpr
पुस्तकालय अतिरिक्त उस के लिए सी ++ 14 योजना बनाई गई है को लागू नहीं करता है में सक्षम हो जाएगा होगा। मैंने जीसीसी 4.7 का इस्तेमाल किया।
संपादित करें: ठीक है, यहाँ बड़ा उदाहरण यह जान सकें कि को अस्वीकार कर दिया है और क्या कर रहा है आता नहीं है:
#include <array>
#include <initializer_list>
constexpr int foo = 42;
constexpr int bar() { return foo; }
struct eggs { int a, b; };
int main()
{
constexpr std::array<int, 3> a = {{ 1, 2, 3 }};
constexpr int a0 = a[0];
constexpr int a1 = a[1];
constexpr int a2 = a[2];
// From Xeo and Andy tests
constexpr std::array<int, 1> a = { bar() }; // OK
constexpr std::array<int, 3> b = {{ a[0], a[1], a[2] }}; // OK
std::initializer_list<int> b = { a[0], a[1], a[2] }; // OK
constexpr std::initializer_list<int> b = { a0, a1, a2 }; // OK
constexpr std::initializer_list<int> b = { foo }; // OK
constexpr std::initializer_list<int> c = { bar() }; // ERROR
constexpr std::initializer_list<int> b = { a[0], a[1], a[2] }; // ERROR
// From Matheus Izvekov and Daniel Krügler
constexpr eggs good = { 1, 2 }; // OK
constexpr std::initializer_list<eggs> bad = { { 1, 2 }, { 3, 4 } }; // ERROR
constexpr std::initializer_list<eggs> bad2 = { good, good }; // ERROR
return 0;
}
"जीसीसी में एक बग है" के बारे में कैसे? :) (यह नहीं कह रहा कि यह एक है, बस एक संभावना है।) और वास्तव में, आप अपने स्वयं के अनुरूप लिखकर 'constexpr' जोड़ों के बिना इसका परीक्षण करने में सक्षम होना चाहिए। इसके अलावा, 'constexpr std :: array b = {{a [0], a [1], a [2]}} के बारे में क्या; '? –
Xeo
शायद [यह] (http://ideone.com/56iP0Y) समस्या को कम करने में मदद करता है –
@Xeo जो भी मैं सरणी के साथ करता हूं वह ठीक काम करता है (आपके उदाहरण सहित, और एंडी वाले केवल 'std :: arrays' के साथ 'std :: startizer_list' का)। ऐसा लगता है कि समस्या केवल संकलन समय पर 'std :: startizer_list' के साथ होती है। मैंने इसे 'constexpr' या 'std :: array' के बिना पुन: उत्पन्न करने का प्रबंधन नहीं किया था। – Morwenn