std :: is_constructible বেসরকারী নির্মাণকারীর জন্য অসামঞ্জস্যপূর্ণ মান প্রদান করে


13

std::is_constructibleপ্রাইভেট কনস্ট্রাক্টরদের পরিচালনা করে কোন বিধিগুলি ? নিম্নলিখিত কোড দেওয়া:

#include <iostream>

class Class {
private:
    Class() { }
};

template <typename T>
class Test {
public:
    static void test() {
        std::cout
            //<< std::is_constructible<Class>::value
            << std::is_constructible<T>::value
            << std::endl;
    }
};

int main() {
    Test<Class>::test();
}

এই প্রিন্টগুলি 0( আইডোন ) অর্থাত্ Tডিফল্ট গঠনযোগ্য নয়।

মন্তব্য করা লাইনটি কমেন্ট না করে, এটি মুদ্রণ করে 11( আদর্শ ), সুতরাং Tসুস্পষ্টভাবে ডিফল্ট গঠনযোগ্য হয়ে ওঠে।

উভয় ফলাফলকে সমর্থন করার জন্য আমি যুক্তি খুঁজে পেতে পারি, তবে আমি বুঝতে পারি না যে মন্তব্য করা লাইনের সাথে কীভাবে দ্বিতীয়টির ফলাফল পরিবর্তন হয়। এটি কি কোনওভাবে ইউবিকে ডাকছে? এটি কি একটি সংকলক বাগ? নাকি std::is_constructibleআসলেই বেমানান?


1
দেখতে একটি জিসিসি বাগের মতো, 9 টি মুদ্রণের00
ঝাঁকুনি

1
আমার মেশিনে সি ++ ১ g গ্রাম ++ ৯.২.১ / জি ++ - ১০.০ এবং std :: is_constructible <...> :: এর সাথে প্রতিস্থাপনের পরিবর্তে I_constructible_v <...> এর সাথে মানটি সংকলন করার সময় আমি অন্য একটি অদ্ভুত মনে করি that ফলাফলটি 00 এ পরিবর্তিত হয়
পরিবর্তিত

1
@ মিটেবলভাইয়েড প্রকৃতপক্ষে - এবং দেখে মনে হচ্ছে ::valueসংস্করণটি এর আগে আগতদের আউটপুট পরিবর্তন করতে সক্ষম: Godbolt.org/z/zCy5xU মন্তব্য করা লাইনটি Uncomment করে এবং সমস্তটি জিসিসিতে 1: s হয়ে যায়।
টেড লিঙ্গমো

1
এটি ঠিক করার আরেকটি উপায়: Godbolt.org/z/EKaP3r তাই মূলত এটি কিছু ধরণের মূল্যায়ন আদেশ বাগ।
মারেক আর

2
@ মিটেবল ভাইয়েড এটি সত্য হয়ে উঠার জন্য আপনার এমনকি ফাংশন টেম্পলেটটি ইনস্ট্যান্ট করার দরকার নেই। এই উদাহরণে, এটি ফিরে আসে falseতবে ফাংশন টেমপ্লেটটি যদি কোনও সমস্যা না করে তা হঠাৎ করে ফিরে আসে true: Godbolt.org/z/zqxdk2
টেড ল্যাংমো

উত্তর:


3

std::is_constructiblefalseএই দৃশ্যে ফিরে আসা উচিত কারণ কনস্ট্রাক্টর অ্যাক্সেসযোগ্য নয়।

প্রশ্নের নীচে নির্দেশিত হিসাবে, প্রশ্নের বর্ণিত আচরণটি জিসিসি / libstdc ++ এ থাকা একটি বাগের কারণে ঘটে is বাগ সংশোধন করা হয় এখানে রিপোর্ট , এবং, Bugzilla- তে, এর যদি কোনো কারণে না এর সাথে সম্পর্কিত অনুযায়ী টেমপ্লেট ফাংশন ক্লাস জন্য প্রবেশাধিকার নিয়ন্ত্রণ বাগ যে বেশ কিছুদিনের জন্য অমীমাংসিত হয়েছে। দুটি বাগের মধ্যকার সম্পর্কটি জোনাথন ওয়াকলির বাগজিলা মন্তব্য থেকে নেওয়া হয়েছে যিনি মনে হয় প্রথমে দুটি বাগের মধ্যে সংযোগটি সনাক্ত করেছেন।

এটি জিসিসিতে এই দৃশ্যের আচরণটি নির্ধারণকারীকে ব্যক্তিগত করার পরিবর্তে মুছে ফেলার সময় সঠিক হয়ে ওঠে:

class Class {
    Class() = delete;
};

যা কপি করে প্রিন্ট আউট 0এবং 00যথাক্রমে। এটি সঠিক আউটপুট (যাclang প্রাইভেট কনস্ট্রাক্টরের পাশাপাশি দৃশ্যে সঠিকভাবে রিপোর্ট করে)।

লাইনে মন্তব্য করার সময় এটি আচরণের পর্যবেক্ষণের পরিবর্তন ব্যাখ্যা করতে পারে , কারণ টেম্প্লেটড স্ট্রাক্টের ভিতরে ফাংশনের ভিতরে , অ্যাক্সেস চেকিং কোনও কাজ করে না এবং রিপোর্ট করে যে কনস্ট্রাক্টর যখন এটি না হয় তখন অ্যাক্সেস থাকে। যখন বৈশিষ্ট্যটি আবার পরের লাইনে বা সম্ভবত সম্পূর্ণ ভিন্ন স্থানে পরীক্ষা করা হয় (যেমনটি হয় তেমন এখানে রয়েছে ) এটি ইতিমধ্যে তাত্ক্ষণিকভাবে কার্যকর হয়েছে এবং এভাবে ভুল উত্তর পাওয়া যায়।

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