std :: ফাংশন কনস্টের সঠিকতা


11

ধরুন আমার কাছে কল করার মতো ধরণ রয়েছে:

struct mutable_callable
{
    int my_mutable = 0;
    int operator()() { // Not const
        return my_mutable++;
    }
};

লক্ষ্য করুন mutable_callableএকটি অ-const হয়েছে operator()যে মডিফাই সদস্য পরিবর্তনশীল .....

এখন ধরুন আমি std::functionআমার ধরণের একটি তৈরি করেছি:

std::function<int()> foo = mutable_callable{};

এখন আমি এটি করতে পারি:

void invoke(std::function<int()> const& z)
{
    z();
}

int main()
{
    invoke(foo); // foo changed.....oops
}

এখন পর্যন্ত আমি যতটা বলতে পারি std::functionসেগুলি operator()হ'ল const: https://en.cppreferences.com/w/cpp/utility/functional/function/operator ()

সুতরাং আমার অন্ত্র অনুভূতি হ'ল আপনি এটি করতে সক্ষম হবেন না .....

তবে তারপরে দেখুন: https://en.cppreferences.com/w/cpp/uटिल / functional / function / function

এটি কলযোগ্য ধরণের একটি ধ্রুবক আছে কিনা তা নিয়ে কোনও প্রতিবন্ধকতা রয়েছে বলে মনে হচ্ছে না operator()......

সুতরাং আমার প্রশ্নটি হ'ল: আমি ধরে নিলাম যে std::function<int()> const&এটি মূলত একই জিনিস হিসাবে ধরে নেওয়া ঠিক যে std::function<int()>&দুজনের আচরণের মধ্যে আসলে কোনও পার্থক্য নেই ...... এবং যদি তা হয় তবে কেন এটি constসঠিক নয় ?


@ ম্যাক্স ল্যাংহোফ নং ..... এর std::functionসাথে এর সমান struct a{ std::any x; };
পরিমাণ আছে

এখানে এমএসভিসি std::functionবাস্তবায়নের ইন্টার্নালগুলির একটি ছোট স্নিপেট রয়েছে : i.stack.imgur.com/eNenN.png যেখানে using _Ptrt = _Func_base<_Ret, _Types...>। আমি আমার মামলা বিশ্রাম।
ম্যাক্স ল্যাংফোফ

উত্তর:


3

এই হিসাবে একই নিচে boils struct A { int* x; };, যেখানে একটি const A a;আপনি পরিবর্তন করতে পারেন মান এর *(a.x)(কিন্তু যেখানে এটি পয়েন্ট)। std::function(ইরেজর টাইপ থেকে) এর মধ্যে ইন্ডিয়ারেশনের একটি স্তর রয়েছে যার মাধ্যমে constপ্রচার হয় না।

এবং না, std::function<int()> const& fঅর্থহীন নয়। একটি std::function<int()>& fআপনি একটি ভিন্ন functor দায়িত্ব অর্পণ করা সক্ষম হবে f, যা আপনি মধ্যে ব্যবহার করতে পারবেন না constকেস।


হ্যাঁ ..... যা আসলে অনেক
অর্থবোধ করে

আমি বিশ্বাস করি এটি একটি ডিজাইনের ত্রুটি। এই নির্দেশটি ব্যবহারকারীর কাছে স্বচ্ছ একটি প্রয়োগকরণ বিশদ হওয়া উচিত এবং কিছু রূপক ব্যবহার করে দৃ const়তা প্রচার করা যেতে পারে।
ইগোর আর।

@IgorR। হ্যাঁ, দৃ const়তা প্রচার করা যেতে পারে। std::vectorএটা করে, std::unique_ptrনা। আমি মনে করি std::functionযদিও ফান্টারের রাজ্যের আক্রমণকারীদের প্রকাশ করার বিষয়ে সত্যই নয়। সম্ভবত আমরা জঘন্য ফাংশন ধরণের (যেমন std::function<int() const>) পার্থক্য করতে পারে?
ম্যাক্স ল্যাংফোফ

unique_ptrনিয়মিত পয়েন্টার না থাকায় দৃ const়তা প্রচার করা উচিত নয়। এবং std::function<int() const>সংকলন না।
ইগোর আর।

@IgorR। আমি জানি. আমার বক্তব্যটি ছিল স্ট্যান্ডার্ড লাইব্রেরির কিছু অংশ এটি করে এবং কিছু অন্যরা তা করে না। কোন বিভাগে std::functionপড়তে হবে তা আমার কাছে পরিষ্কার নয়। এবং এটি std::function<int() const>একটি অনুমানমূলক ছিল - অবশ্যই এটি এখনই সংকলন করে না, তবে এটি কি এখানে যেমন ওপি বৈধ করা যায়, তা প্রকাশ করে "কেবলমাত্র operator() const(বা রাষ্ট্রবিহীন) দিয়ে ফান্টিকার নিয়োগ করা যেতে পারে "? (এমনকি ঘৃণ্য ফাংশন ধরণের ব্যবহারের কারণে এমন পর্দার পিছনে যদি বেশ নৃশংস হবে)?
সর্বোচ্চ ল্যাঙ্গোফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.