c++ - क्यों नहीं करता है remove_reference कार्यों पर काम करता है?




templates types (2)

आपके पास जो प्रकार है वह किसी फ़ंक्शन का संदर्भ नहीं है, बल्कि एक संदर्भ क्वालिफायर वाला फ़ंक्शन है।

static_assert(std::is_same_v<void()&, void()&>);
static_assert(!std::is_same_v<void()&, void(&)()>);
static_assert(std::is_same_v<void(&)(), void(&)()>);
static_assert(std::is_same_v<void(), std::remove_reference_t<void(&)()>>);

दूसरे दिन मेटाप्रोग्रामिंग करते समय कुछ अजीब तरीके से दौड़ें। यह मूल रूप से इस दावे के लिए नीचे आता है (जैसा कि मैं उम्मीद करूंगा) गुजर रहा है।

static_assert(std::is_same_v<void(), std::remove_reference_t<void()&>>);

पहले तो मुझे लगा कि मैं एक फ़ंक्शन संदर्भ को परिभाषित करने के लिए एक वाक्यात्मक गलती कर रहा हूं, लेकिन यह दावा है कि यह मामला नहीं है।

static_assert(std::is_same_v<void()&, void()&>);

मैंने remove_reference से स्रोत को कॉपी करते remove_reference स्वयं remove_reference लागू करने का प्रयास किया, लेकिन वह भी काम नहीं किया। यहाँ क्या हो रहा है?


घृणित कार्य प्रकारों की दुनिया में आपका स्वागत है।

void() & void() संदर्भ नहीं है void() । वर्तनी का तरीका जो void(&)() (जो यदि remove_reference_t , तो आपको वापस void() मिलेगा void() - जो remove_reference_t फ़ंक्शन के संदर्भ में काम करता है , यदि आप जो प्रदान करते हैं वह वास्तव में फ़ंक्शन प्रकार का संदर्भ है )।

आपके द्वारा कक्षा से हटने के बाद क्या void() & वास्तव में संदर्भित होता है, संदर्भ-योग्य सदस्य फ़ंक्शन का प्रकार है। अर्थात्:

struct C {
    void f() &;
};

&C::f का प्रकार void (C::*)() & । लेकिन सदस्यों को सभी संकेत कुछ प्रकार के T लिए TC::* रूप में लिखे जा सकते हैं, और इस मामले में T टाइप void() &

P0172 भी देखें।






c++17