আমার ক্লাসটি কেন ডিফল্ট-গঠনমূলক?


28

আমার এই ক্লাসগুলি রয়েছে:

#include <type_traits>

template <typename T>
class A {
public:
    static_assert(std::is_default_constructible_v<T>);

};

struct B {
   struct C {
      int i = 0;
   };

    A<C> a_m;
};

int main() {
    A<B::C> a;
}

সংকলন করার সময়, a_mএটি ডিফল্ট গঠনমূলক নয় তবে aহয়।

এতে পরিবর্তন Cকরার সময়:

struct C {
      int i;
   };

সবকিছু ঠিক আছে.

ঝাঁকুনি 9.0.0 সঙ্গে পরীক্ষিত।


3
জিসিসি 8.3 - ঠিক আছে, জিসিসি 9.1 / 9.2 - ব্যর্থ।
এভগ

2
সঙ্গে C() {}এটা খুব কাজ করে,।
এভগ

3
এটি আমার কাছে বগির গন্ধ পাচ্ছে। তত্ক্ষণাত বাগজিলায় সুস্পষ্ট মিল নেই।
অরব্বিটের হালকাত্বের রেস

2
জবর: static_assertমধ্যে Aব্যর্থ হয়, কিন্তু যদি আপনি পরিবর্তে ডিফল্ট কনস্ট্রাক্ট একটি Tভেতরে A(যেমন একজন সদস্য করা T t;আছে), এটা সব কাজ করে জরিমানা। ধরণের বৈশিষ্ট্য আপনাকে কী বলছে এবং আসলে কী সম্ভব তার মধ্যে একটি অসঙ্গতি ...
সেব্রোকম

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

উত্তর:


9

এটি স্ট্যান্ডার্ডের পাঠ্য এবং মন্তব্যগুলিতে উল্লিখিত বেশ কয়েকটি বড় বাস্তবায়ন দ্বারা উভয়কেই অনুমোদিত নয়, তবে সম্পূর্ণ সম্পর্কহীন কারণে।

প্রথমত, "বইয়ের দ্বারা" কারণ: তাত্ক্ষণিকতার বিন্দুটি A<C>স্ট্যান্ডার্ড অনুসারে সংজ্ঞা সংশোধন করার আগেইB এবং তাত্ক্ষণিকতার বিন্দুটি std::is_default_constructible<C>তার আগেই:

ক্লাস টেম্পলেট বিশেষায়নের জন্য, [...] যদি বিশেষতাকে স্পষ্টভাবে ইনস্ট্যান্ট করা হয় কারণ এটি অন্য টেম্পলেট বিশেষায়নের মধ্যে থেকে উল্লেখ করা হয়, যদি বিশেষত্বটি যে প্রসঙ্গে থেকে রেফারেন্স করা হয় তা যদি কোনও টেম্পলেট প্যারামিটারের উপর নির্ভর করে, এবং যদি বিশেষণটি পূর্ববর্তী ইনস্ট্যান্ট না হয় ঘেরযুক্ত টেম্পলেটটির ইনস্ট্যান্টেশন করার জন্য, তীরচিহ্ন টেম্পলেটটি ইনস্ট্যান্ট করার বিন্দুর সাথে সাথে ইনস্ট্যান্টেশন বিন্দুটি হয়। অন্যথায়, এই ধরনের বিশেষীকরণের জন্য তাত্ক্ষণিকতা তাত্ক্ষণিকভাবে नेमস্পেসের স্কোপ ডিক্লেয়ারেশন বা সংজ্ঞাটির আগে রয়েছে যা বিশেষীকরণকে বোঝায়।

যেহেতু Cসেই মুহূর্তে পরিষ্কারভাবে অসম্পূর্ণ, তাত্ক্ষণিক আচরণের সংজ্ঞা দেওয়া হয়নি std::is_default_constructible<C>। যাইহোক, মূল সংখ্যা 287 দেখুন , যা এই নিয়মটি পরিবর্তন করবে।


বাস্তবে, এনএসডিএমআইয়ের সাথে এটি করা দরকার।

  • এনএসডিএমআইগুলি অদ্ভুত কারণ তারা পার্সিংয়ে দেরি করে - বা মানক সংসদে তারা একটি "সম্পূর্ণ-শ্রেণীর প্রসঙ্গ"।
  • সুতরাং, এটি = 0নীতিগতভাবে Bএখনও ঘোষিত না হওয়া বিষয়গুলিকে নির্দেশ করতে পারে , সুতরাং বাস্তবায়ন এটি শেষ না হওয়া অবধি সত্যিই এটিকে বিশ্লেষণের চেষ্টা করতে পারে না B
  • একটি শ্রেণি সম্পূর্ণ করার জন্য বিশেষ সদস্য ফাংশনগুলির বিশেষত পূর্বনির্ধারিত কনস্ট্রাক্টরের অন্তর্নিহিত ঘোষণার প্রয়োজন হয়, যেমন Cকোনও কনস্ট্রাক্টর ঘোষণা না করে।
  • এই ঘোষণার অংশগুলি (কনটেক্সপ্রস-নেস, নোসেপ্ট-নেস) এনএসডিএমআইয়ের বৈশিষ্ট্যের উপর নির্ভর করে।
  • সুতরাং, যদি সংকলকটি এনএসডিএমআইকে বিশ্লেষণ করতে না পারে তবে এটি ক্লাসটি শেষ করতে পারে না।
  • ফলস্বরূপ, যখন এটি তাত্ক্ষণিক হয় তখন A<C>এটি মনে Cহয় এটি অসম্পূর্ণ।

বিলম্বিত-বিশ্লেষিত অঞ্চলগুলির সাথে সম্পর্কিত এই পুরো অঞ্চলটি বাস্তবায়নের বিচ্যুতি সহ, ভীতিজনকভাবে অপ্রকাশিত। এটি পরিষ্কার হওয়ার আগে কিছুটা সময় লাগতে পারে।


0

অপরিজ্ঞাপিত আচরণটি হ'ল:

উপরের কোনও টেম্পলেটটির ইনস্ট্যান্টেশন যদি কোনও অসম্পূর্ণ প্রকারের উপর প্রত্যক্ষ বা অপ্রত্যক্ষভাবে নির্ভর করে এবং যদি সেই ধরণের অনুমানটি সম্পূর্ণ করা হয় তবে আচরণটি অনির্ধারিত হয়।


7
সি অসম্পূর্ণ কেন?
interjay

1
@ ইনটারজয়, Cসম্পূর্ণ, তবে Bতা নয়। এবং B::Cপরোক্ষভাবে নির্ভর করে B
ইভ

1
@ এভগ পাঠ্যটি "সরাসরি বা অপ্রত্যক্ষভাবে নির্ভর করে" কেবলমাত্র cppreferences.com এ প্রদর্শিত হয়। স্ট্যান্ডার্ডটি কেবল বলে যে টি টাইপটি সম্পূর্ণ হওয়া দরকার।
interjay


2
@ ইনটারজয় আমি এই শব্দটির বেশিরভাগ অংশ লিখেছি। আমরা যা বলার চেষ্টা করছি তা হ'ল 1) আপনি যদি এমন কোনও উপায়ে ইনস্ট্যান্ট করেন যা পরে কিছু অসম্পূর্ণ প্রকার সম্পূর্ণ হওয়ার পরে ওডিআর লঙ্ঘনের জন্য উত্সাহিত করতে পারে, এটি অপরিজ্ঞাত; এবং 2) এটা অনির্দিষ্ট এমনকি আপনার না আসলে আপনার প্রোগ্রাম একটি ODR লঙ্ঘন কারণ, মানক গ্রন্থাগার বাস্তবায়নের নির্ণয় করতে যে সময়ে বৈশিষ্ট্য ব্যবহার করা হয় যদি তারা তাই কামনা নির্বাচন করতে পারবেন, যাতে। যদি Cকিছু অদ্ভুত SFINAE এর সাথে কোনও ডিফল্ট কনস্ট্রাক্টর টেম্পলেট থাকে Bযা আলাদাভাবে সম্পূর্ণ করা হয় তবে উত্তরগুলি পরিবর্তন করতে পারে , তবে তা নিশ্চিত করুন, বৈশিষ্ট্য এটির উপর নির্ভর করে।
টিসি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.