c++ - কেন সরান_আপনার কাজগুলিতে কাজ করে না?




templates types (2)

অন্য দিন কিছু টেমপ্লেট বিপণন করার সময় অদ্ভুত কিছুতে ছড়িয়ে পড়ে Ran এটি মূলত এই দাবিতে নেমে আসে না (যেমনটি আমি প্রত্যাশা করব) উত্তীর্ণ হবে না।

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

প্রথমে আমি ভেবেছিলাম আমি কোনও ফাংশন রেফারেন্স সংজ্ঞায়িত করে সিনট্যাক্টিক ভুল করছি, তবে এই দৃser়তাটি পাস হয়, এটি দেখায় যে এটি ঘটেনি।

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

আমি remove_reference থেকে উত্সটি অনুলিপি করে remove_reference প্রয়োগের চেষ্টা করেছি কিন্তু এটিও কার্যকর হয়নি। এখানে কি হচ্ছে?


আপনার ধরণটি কোনও ফাংশনের রেফারেন্স নয়, তবে একটি রেফারেন্স কোয়ালিফায়ারযুক্ত ফাংশন।

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(&)()>>);

জঘন্য ফাংশন প্রকারের বিশ্বে আপনাকে স্বাগতম।

void() & এটি void() & কোনও রেফারেন্স নয় । বানান করার উপায় যা remove_reference_t void(&)() (যদি আপনি remove_reference_t , আপনি আবার remove_reference_t যাবেন void() - এটি হ'ল remove_reference_t ফাংশনগুলির রেফারেন্সে কাজ করে, যদি আপনি এটি সরবরাহ করেন তবে এটি আসলে ফাংশনের ধরণের একটি রেফারেন্স )।

void() & আসলে কী বোঝায় তা হল আপনি ক্লাসটি ছিটকে যাওয়ার পরে একটি রেফারেন্স-যোগ্য সদস্য ফাংশনের ধরণ। এটাই:

struct C {
    void f() &;
};

&C::f এর ধরণ void (C::*)() & । তবে সদস্যদের সমস্ত পয়েন্টার TC::* কোনও টাইপ T জন্য লেখা যেতে পারে, এবং এই ক্ষেত্রে T টাইপটি void() &

P0172 এও দেখুন।





c++17