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


38

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

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

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

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

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

উত্তর:


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
কারও উচিত ঘৃণ্য ফাংশন ধরণের জন্য একটি প্রৌ question় প্রশ্ন তৈরি করা উচিত।
ব্রায়ান

বাহ, সি ++ আমাকে প্রায় 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(&)()>>);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.