c++ - constexpr std::array with static_assert -
#include & lt; iostream & gt; # शामिल करें & lt; सरणी & gt; Int main (int argc, char ** argv) {constexpr const std :: array और lt; int, 2 & gt; Arr {{0, 1}}; Constexpr const int arr2 [] = {0, 1}; Static_assert (arr [0] == arr2 [0], "asdf"); Static_assert (एआरईआर [1] == एआर 2 [1], "asdfasdf"); वापसी 0; }
जब जीसीसी 4.8.2
और 4.9.1
का उपयोग करके जी ++ test.cpp --std = c का उपयोग किया गया हो ++ 11
, संकलन सफल होता है क्लैंग 3.4
और 3.5
का उपयोग करके clang ++ test.cpp --std = c ++ 11
के साथ संकलित किया गया है, हालांकि, संकलन विफल रहता है:
test.cpp: 8: 16: त्रुटि: static_assert अभिव्यक्ति एक अभिन्न स्थिर अभिव्यक्ति नहीं है static_assert (arr [0] == arr2 [0], "asdf"); ^ ~~~~~~~~~~~~~~~~ test.cpp: 8: 16: नोट: गैर-स्थिरता फ़ंक्शन 'ऑपरेटर []' का निरंतर अभिव्यक्ति में उपयोग नहीं किया जा सकता
तो मेरा सवाल है, जो संकलक सी ++ 11 के अनुपालन के अर्थ में "सही" है? और, अगर झूठ
सही है, तो क्यों std :: array का ऑपरेटर []
constenpr सक्षम नहीं है? ऐसा नहीं बल्कि उन चीजों में से एक है जो std :: array
को हल करने में मदद करना चाहिए था?
ऐसा लगता है कि झूठ
सही है, सी ++ 11 में एक constexpr नहीं है, लेकिन सी ++ 14 में एक constexpr नहीं है
constexpr const_reference ऑपरेटर [] (आकार_प्रकार स्थिति) const; (
इसलिए -std = c ++ 14
के साथ संकलन करना चाहिए ( )।
अनुभाग में 23.3.2.1
वर्ग टेम्प्लेट अररे ओवरव्यू में ऑपरेटर के लिए निम्नलिखित है []
:
संदर्भ ऑपरेटर [] (आकार_प्रकार n); Const_reference ऑपरेटर [] (size_type n) const;
जबकि इसके पास है:
संदर्भ ऑपरेटर [] (size_type n); Constexpr const_reference ऑपरेटर [] (size_type n) const; ^^^^^^^^^
अपडेट
ड्राफ्ट मानक जो सी ++ 11 के बाद आया था, इसमें सुधार सी ++ 11। इसमें ऑपरेटर [
] का एक constexpr संस्करण शामिल है अगर यह एक दोष रिपोर्ट का हिस्सा था, तो जीसीसी सही होगा और यह
घन 3.6.0
पर विचार करने योग्य है, सी ++ 11 मोड में भी कार्यक्रम स्वीकार करता है।
अद्यतन 2
मैंने उस दस्तावेज़ को पाया जो परिवर्तनों को प्रस्तुत करता है, और जब से मैं इस विशिष्ट मुद्दे पर कोई दोष रिपोर्ट नहीं मिल पाता है तो यह एक वृद्धि की तरह लगता है और इसलिए सी ++ 11 का हिस्सा नहीं होना चाहिए।
Comments
Post a Comment