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


38

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

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

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

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

मैंने remove_referenceखुद को cppreference से स्रोत को कॉपी करने की कोशिश की, लेकिन यह भी काम नहीं किया। यहाँ क्या हो रहा है?

जवाबों:


42

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

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

void() &कक्षा से अलग होने के बाद वास्तव में संदर्भित संदर्भ प्रकार क्या है । अर्थात्:

struct C {
    void f() &;
};

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

P0172 को भी देखें ।


3
किसी को घृणित फ़ंक्शन प्रकारों के लिए एक विहित प्रश्न बनाना चाहिए।
ब्रायन

वाह, C ++ मुझे कभी भी आश्चर्यचकित करने में विफल नहीं होता है, भले ही मैंने लगभग 10 वर्षों तक सीखा और इसका उपयोग किया हो।
केल्विन हू

13

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

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(&)()>>);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.