কেন std :: পারমাণবিক কনস্ট্রাক্টর সি ++ 14 এবং সি ++ 17 এ আলাদা আচরণ করে


19

আমি সি ++ 11 নিয়ে একটি প্রকল্পে কাজ করছি এবং কোড অনুসরণ করার চেষ্টা করেছি

#include <atomic>

struct A {
    std::atomic_int idx = 1;

};

int main() {
    return 0;
}

আমি সংকলক ত্রুটি পেয়েছি

error: use of deleted function 'std::__atomic_base<_IntTp>::__atomic_base(const std::__atomic_base<_IntTp>&) [with _ITp = int]'
 std::atomic_int idx = 1;
                       ^

সি ++ 14 এর সাথে একই ফলাফল। আমি যখন সি ++ 17 এ চলেছি এটি কাজ করে: ভ্যান্ডবক্স

আমি পার্থক্যগুলির জন্য cppreferences পরীক্ষা করেছি:

তবে সি ++ 14 এবং সি ++ 17 এর মধ্যে কোনও পার্থক্য নথিভুক্ত নেই। এটি কেন সি ++ 17 এর সাথে কাজ করে না সি ++ 14 এর সাথে?


আপনি কোন সংকলক / স্ট্যান্ডার্ড গ্রন্থাগার / প্ল্যাটফর্ম ব্যবহার করেন?
ভিক্টর গুবিন

@ ভিক্টরবুবিন লিনাক্সে (ওয়ানডবক্স) ক্ল্যাং এবং জিসিসির সাথে চেষ্টা করেছিলাম। আমি বিভিন্ন সংস্করণ চেষ্টা করেছিলাম।
থমাস সাবলিক

1
আপনি স্ট্রাক্ট কনস্ট্রাক্টরের পরিবর্তে এমসিভিইকে কেবলমাত্র একটি স্থানীয় main(বা কোনও ফাংশন, এটির প্রয়োজন হয় না main) সরল করতে পারেন । ক্ল্যাং একইরকম ত্রুটি বার্তা দেয়, এটি আরও স্পষ্ট করে যে এটি ইনিশিয়ালাইজার বা প্লেইন কনস্ট্রাক্টরের পরিবর্তে মুছে ফেলা কপি কনস্ট্রাক্টর ব্যবহার করার চেষ্টা করছে : গডবোল্ট.আর.জেজ / এসবিজিফ 9 ডব্লিউবিসি ++
পিটার

@ পিটারকর্ডস আমি নিশ্চিত ছিলাম না যে এই ত্রুটিটি ক্লাস আরম্ভের সাথে সম্পর্কিত কিনা।
থমাস সাবলিক

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

উত্তর:


29

কারণ সি ++ 17 এ রয়েছে একটি গ্যারান্টিযুক্ত আরভিও। সি ++ 14 বিবৃতিগুলির মতো সালে Foo x = Foo(args)এবং Foo x (args)টেকনিক্যালি একই হয় না, কিন্তু তারা সি ++ 17 এ আছে।

struct Foo {
    Foo() = default;
    Foo(const Foo&) = delete;
};

int main() {
    // Works in C++17 and C++20, fails in C++14 and before
    Foo foo = Foo(); 
}

আপনি এখানে এ সম্পর্কে আরও পড়তে পারেন: https://en.cppreferences.com/w/cpp/language/copy_elision

বিশেষ করে বিভাগ (since C++17):

টি x = টি (টি (চ (ফ ())); // এক্স এর আরম্ভ করার জন্য টি এর ডিফল্ট কনস্ট্রাক্টরে কেবল একটি কল

সি ++ 14 কোডের কাজ করতে আপনি ব্যবহার করতে পারেন

std::atomic_int idx { 1 };
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.