, मैं निम्नलिखित व्यवहार को नहीं समझता:

#include <memory>

template <int Index, typename Type>
struct position {
    using value_type = Type;

    template <typename TT>
    constexpr position( TT& val )
        : value{ val }
    {
    }

    static constexpr int index = Index;
    Type &               value;
};

int main()
{

    constexpr double d = 3.14;
    constexpr auto p1=position<3, const double>(d).value; // ok
    constexpr auto p2=position<3, const double>(d); // error
}

क्यों position<3, double>(3.14).value एक स्थिर व्यंजक हो सकता है जबकि position<3, double>( 3.14 ) नहीं है?

मैं समझता हूं कि संकलक "स्थिति :: मान" डेटा सदस्य को एक कॉन्स्ट संदर्भ होना चाहेगा, लेकिन क्यों, संदर्भ एक शाब्दिक प्रकार नहीं है?

3
Paolo Crosetto 29 जून 2018, 15:55

1 उत्तर

सबसे बढ़िया उत्तर

संदर्भ डेटा सदस्य के साथ एक संरचना एक शाब्दिक प्रकार नहीं है?

हां, ऐसी संरचना एक शाब्दिक प्रकार है।

position<3, const double>(d) एक स्थिर व्यंजक नहीं है क्योंकि इसका सदस्य value स्थिर व्यंजक के अनुमत परिणाम को संदर्भित नहीं करता है, क्योंकि value (यानी d) न तो स्थिर भंडारण अवधि वाली कोई वस्तु है और न ही कोई फ़ंक्शन।

[expr.const]/6:

एक स्थिर व्यंजक [...] या एक प्रचलित कोर स्थिरांक व्यंजक है जिसका मान निम्नलिखित बाधाओं को पूरा करता है:

  • यदि मान वर्ग प्रकार की वस्तु है, तो संदर्भ प्रकार का प्रत्येक गैर-स्थिर डेटा सदस्य एक ऐसी इकाई को संदर्भित करता है जो एक स्थिर अभिव्यक्ति का अनुमत परिणाम है,
  • [...]

एक इकाई स्थिर अभिव्यक्ति का अनुमत परिणाम है यदि यह स्थिर भंडारण अवधि के साथ एक वस्तु है [...], या यह एक फ़ंक्शन है।

3
cpplearner 29 जून 2018, 16:24