কনসেক্সট্রপ কনস্ট্রাক্টরে একটি অ্যারের সূচনা করার জন্য আইনী?


11

নিম্নলিখিত কোডটি বৈধ?

template <int N>
class foo {
public:
    constexpr foo()
    {
        for (int i = 0; i < N; ++i) {
            v_[i] = i;
        }
    }

private:
    int v_[N];
};

constexpr foo<5> bar;

কলং এটি গ্রহণ করে, তবে জিসিসি এবং এমএসভিসি এটি প্রত্যাখ্যান করে।

জিসিসির ত্রুটিটি হ'ল:

main.cpp:15:18: error: 'constexpr foo<N>::foo() [with int N = 5]' called in a constant expression
   15 | constexpr foo<5> bar;
      |                  ^~~
main.cpp:4:15: note: 'constexpr foo<N>::foo() [with int N = 5]' is not usable as a 'constexpr' function because:
    4 |     constexpr foo()
      |               ^~~
main.cpp:4:15: error: member 'foo<5>::v_' must be initialized by mem-initializer in 'constexpr' constructor
main.cpp:12:9: note: declared here
   12 |     int v_[N];
      |         ^~

এই ধরণের কোড যদি ঠিক থাকে তবে আমি বেশ কয়েকটি index_sequenceগুলি ব্যবহার করতে পারতাম ।



আপনি এমএসভিসি থেকে ত্রুটি প্রতিলিপি করতে পারেন?
সর্বোচ্চ 66

... এবং জিসিসিও।
এভগ

1
@ সিংগুয়ানায়াও - জি ++ 10 এটি সি ++ ২০ সংকলন করে নিন; এটি C ++ 17 বা তার বেশি বয়সী সংকলন করতে অস্বীকার করে; বিন্দুটি মনে হয় যে _vসি ++ 17 অবধি প্রাথমিক সূচনার সূচনা হওয়া উচিত। হতে পারে C ++ 20 এ কিছু পরিবর্তন করা হয়েছে।
সর্বাধিক66

2
@ এভগটি এটি সত্যই আকর্ষণীয়, কারণ এটি পরামর্শ দিতে পারে যে ক্ল্যাং তার "সচেতনতা" ব্যবহার করে যে কোনও স্থির-স্টোরেজ-সময়কাল অবজেক্টটি শূন্য হয়ে যায় "ঠিক আছে, এই বস্তুটি ডিফল্ট-সূচনা হতে পারে তবে এর intসদস্যের কাছ থেকে পড়া কখনই অপরিজ্ঞাত আচরণ করবে না "। আমি অবাক হই যে, জিসিসি তা অনুগত নয়, বা অন্যভাবে নয় ...
লাইটনেস রেস

উত্তর:


13

তুচ্ছ ডিফল্ট সূচনাটি C ++ 20 অবধিconstexpr প্রসঙ্গে নিষিদ্ধ ছিল ।

কারণটি, আমি অনুমান করছি, এটি হ'ল "দুর্ঘটনাক্রমে" ডিফল্ট-আঞ্চলিক আদিমদের থেকে পড়া সহজ, এটি এমন একটি কাজ যা আপনার প্রোগ্রামকে অপরিজ্ঞাত আচরণ দেয় এবং অপরিজ্ঞাত আচরণের সাথে অভিব্যক্তিগুলি সরাসরি constexpr( রেফ ) থেকে নিষিদ্ধ । ভাষাটি প্রসারিত করা হয়েছে যদিও এখন একটি সংকলক অবশ্যই এই ধরণের পাঠ পড়ে কিনা তা পরীক্ষা করে দেখানো উচিত এবং যদি তা না হয় তবে ডিফল্ট-আরম্ভকরণ গ্রহণ করা উচিত। এটি সংকলকটির জন্য কিছুটা বেশি কাজ, তবে (যেমনটি আপনি দেখেছেন) প্রোগ্রামারটির জন্য যথেষ্ট সুবিধা রয়েছে।

এই কাগজটি অনির্ধারিত আচরণের অনুরোধটিকে অগ্রাহ্য করার সময় অব্যাহতভাবে কনস্টেক্সপ্র প্রসঙ্গে তুচ্ছভাবে ডিফল্ট গঠনমূলক প্রকারের জন্য ডিফল্ট সূচনা করার অনুমতি দেওয়ার প্রস্তাব দেয় oses সংক্ষেপে, যতক্ষণ না অবিচ্ছিন্ন মানগুলি পড়া হয় না, ততক্ষণ এই ধরণের রাজ্যগুলিকে গাদা এবং স্ট্যাক উভয় পরিস্থিতিতে বরাদ্দ করা উচিত x

সি ++ ২০, যেহেতু v_আপনার মতো "অবিচ্ছিন্ন" ছেড়ে যাওয়া আইনী । তারপরে আপনি এর সমস্ত উপাদানগুলির মান নির্ধারণ করতে চলেছেন, যা দুর্দান্ত।


4
@ max66 আমাকেও! আমি যা করেছি তা হ'ল উইকিপিডিয়ায় সি ++ 20 পরিবর্তন তালিকা স্ক্যান করা constexpr, এর সাথে প্রাসঙ্গিক কিছু সন্ধান করা এবং লিঙ্কযুক্ত প্রস্তাবটি স্কিম করা;)
লাইটনেস রেস

3
খারাপ অংশটি হ'ল আমি সি ++ ব্যবহার করছি 20 বছরেরও বেশি সময়। প্রতিদিন যদি আমি নতুন কিছু শিখি ... বা আমি একটি খারাপ প্রোগ্রামার বা সি ++ খুব জটিল হয়ে উঠছি।
সর্বাধিক 66

5
@ ম্যাক্স 6666 এটি অবশ্যই পরবর্তীকালে। এছাড়াও এটি প্রতি বছর কয়েক বছর ধরে মৌলিকভাবে পরিবর্তন করে চলেছে তা এটিকে দ্রুত গতিশীল লক্ষ্য হিসাবে পরিণত করে। কে তা ধরে রাখতে পারে ?! এমনকি সংকলকরা এটি ধরে রাখে না।
অরবিটে হালকা ঘোড়দৌড়

@ সর্বোচ্চ 66 এই কাগজটি মনে আসে: ভাসার কথা মনে রাখবেন!
এড

@ এভগ ওহ, বাহ, এই কাগজটি আমাকে (IRONY) দিয়ে গেছে। চিহ্নিত করা!
অরবিটে হালকা ঘোড়দৌড়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.