টেমপ্লেট এবং নাম অনুসন্ধান বোঝার চেষ্টা করা


9

আমি নীচের কোড স্নিপেটগুলি বোঝার চেষ্টা করছি

স্নিপেট # 1

template <typename T>
struct A
{
    static constexpr int VB = T::VD;
};

struct B : A<B>
{
};

Gcc9 বা clang9 উভয়ই এখানে ত্রুটি ফেলে না।

প্র: কেন এই কোডটি সংকলন করে? A<B>বি থেকে উত্তরাধিকার সূত্রে আমরা কি তাত্ক্ষণিক হচ্ছি না ? বি তে কোনও ভিডি নেই, তাই সংকলকটি কি এখানে একটি ত্রুটি ফেলে না?

স্নিপেট # 2

template <typename T>
struct A
{
    static constexpr auto AB = T::AD; // <- No member named AD in B
};

struct B : A<B>
{
    static constexpr auto AD = 0xD;
};

এই ক্ষেত্রে, gcc9 জরিমানা সংকলন করে তবে ক্ল্যাং 9 একটি ত্রুটি ছুড়ে দেয় "বি তে অ্যাড নামের কোনও সদস্য নয়" saying

প্র: এটি জিসিসি 9 এর সাথে কেন সংকলন করে / কেন এটি ক্ল্যাং 9 দিয়ে সংকলন করে না?

স্নিপেট # 3

template <typename T>
struct A
{
    using TB = typename T::TD;
};

struct B : A<B>
{
    using TD = int;
};

এখানে clang9 এবং gcc9 উভয়ই একটি ত্রুটি ফেলে। gcc9 "" অসম্পূর্ণ প্রকারের স্ট্রাক্ট বি "এর অবৈধ ব্যবহার" বলে।

প্র: যদি স্ট্রাক্ট বি এখানে অসম্পূর্ণ থাকে তবে কেন এটি স্নিপেট # 2 এ অসম্পূর্ণ নয়?

কম্পাইলার পতাকা ব্যবহৃত: -std=c++17 -O3 -Wall -Werror। আগাম ধন্যবাদ!!!


@ এক্সপশন দিয়ে struct Bইনস্ট্যান্ট Aকরছে না B?
পরিবর্তনীয় পার্শ্ব প্রতিক্রিয়া

ক্ল্যাং 9 "বি তে অ্যাড নামের কোনও সদস্য নয়" বলে ত্রুটি ছুঁড়ে ফেলেছে । যেমনটি Bঅসম্পূর্ণ ... তবে সদস্য কখন ইনস্ট্যান্ট করা উচিত তা নিশ্চিত নয় ..
জারোড 42

@ পরিবর্তনযোগ্য পার্শ্ব প্রভাব ওহ হ্যাঁ, আমার খারাপ, টেমপ্লেট হিসাবে এটি পড়ুন :(
এক্সসেপশন

@ জারোড 42 তারপরে জিসিসি কেন জরিমানা করে?
পরিবর্তনীয় পার্শ্ব প্রতিক্রিয়া

1
আমি এই প্রশ্নটিকে "আরও ফোকাসের প্রয়োজন" হিসাবে পতাকাঙ্কিত করেছি এবং প্রশ্নটিতে প্রকৃতপক্ষে একাধিক প্রশ্ন রয়েছে (সুতরাং আমার উপসংহার), সুতরাং আমার পতাকাটি কেন ভুল?
ডোমিনিক

উত্তর:


4

আমি বিশ্বাস করি যে এগুলি মূলত [টেম্পেস্টেস্ট ২ / ​​২ (জোর খনি) এ সিদ্ধ হয় :

একটি বর্গ টেমপ্লেট বিশেষজ্ঞতা অন্তর্নিহিত ইনস্ট্যান্স ঘোষণা অন্তর্নিহিত ইনস্ট্যান্স সৃষ্টি করে কিন্তু সংজ্ঞা না , ডিফল্ট আর্গুমেন্ট, অথবা noexcept-নির্দিষ্টকরী এর বর্গ সদস্য ফাংশন, সদস্য ক্লাস, scoped সদস্য enumerations, স্ট্যাটিক ডাটা সদস্যদের , সদস্য টেমপ্লেট, এবং বন্ধুদের; [...]

এবং [temp.inst] / 9

কোনও বাস্তবায়ন সুস্পষ্টভাবে তাত্ক্ষণিকভাবে […] শ্রেণীর টেম্পলেটের স্থিতিশীল ডেটা সদস্য […] ততক্ষণ তত্ক্ষণাত জোর করে না।

অন্তর্নিহিত টেম্পলেট ইনস্ট্যান্টেশন সম্পর্কিত স্ট্যান্ডার্ড শব্দটি অনেক বিবরণ ব্যাখ্যার জন্য উন্মুক্ত। সাধারণভাবে, এটা আমার কাছে মনে হবে যে আপনি কেবল একটি টেম্পলেটের অংশের উপর নির্ভর করতে পারে না না instantiated হচ্ছে যদি না স্পেসিফিকেশন স্পষ্টভাবে তাই বলছেন। এভাবে:

স্নিপেট # 1

প্র: কেন এই কোডটি সংকলন করে? বি থেকে উত্তরাধিকার সূত্রে আমরা কী তত্ক্ষণাতন করছি না? বি তে কোনও ভিডি নেই, তাই সংকলকটি কি এখানে একটি ত্রুটি ফেলে না?

আপনি তাত্ক্ষণিক হয় A<B>। তবে তাত্ক্ষণিকভাবে A<B>কেবল ঘোষণাগুলি তাত্ক্ষণিক করে তোলে, এর স্থির ডেটা সদস্যদের সংজ্ঞা নয়। VBএমন কোনও উপায়ে কখনই ব্যবহৃত হয় না যার অস্তিত্বের জন্য কোনও সংজ্ঞা প্রয়োজন। সংকলকটির এই কোডটি গ্রহণ করা উচিত।

স্নিপেট # 2

প্র: এটি জিসিসি 9 এর সাথে কেন সংকলন করে / কেন এটি ক্ল্যাং 9 দিয়ে সংকলন করে না?

জারোড 42 দ্বারা নির্দেশিত হিসাবে, ঘোষণায় ABএকটি স্থানধারক ধরণের থাকে। এটি আমার কাছে মনে হবে যে স্ট্যান্ডার্ডটির শব্দটি এখানে কী ঘটবে বলে মনে করা হচ্ছে তা সত্যই পরিষ্কার নয়। কোনও স্থির ডেটা সদস্যের ঘোষণার তাত্ক্ষণিকতায় কোনও স্থানধারক ধরণের ট্রিগার স্থানধারক ধরণের কাটা থাকে এবং এইভাবে স্থিতিশীল ডেটা সদস্যের সংজ্ঞা প্রয়োজন এমন এমন একটি ব্যবহার গঠন করে? আমি স্ট্যান্ডার্ডে শব্দটি খুঁজে পাচ্ছি না যা স্পষ্টভাবে হ্যাঁ বা এটির জন্য বলবে। সুতরাং, আমি বলব যে উভয় ব্যাখ্যা এখানে সমানভাবে বৈধ এবং এইভাবে, জিসিসি এবং ঝনঝন উভয়ই সঠিক ...

স্নিপেট # 3

প্র: যদি স্ট্রাক্ট বি এখানে অসম্পূর্ণ থাকে তবে কেন এটি স্নিপেট # 2 এ অসম্পূর্ণ নয়?

একটা ক্লাস টাইপ সময়ে শুধুমাত্র সম্পূর্ণ হলে যেখানে আপনি ক্লোজিং পৌঁছানোর }এর ক্লাস-সুনির্দিষ্টভাবে উল্লেখ করা [class.mem] / 6 । সুতরাং, আপনার সমস্ত Bস্নিপকেটের অন্তর্নিহিত ইনস্ট্যান্টিশনের সময় এটি অসম্পূর্ণ A<B>। এটি স্নিপেট # 1 এর জন্য অপ্রাসঙ্গিক ছিল। স্নিপেট # 2 এ, ঝনঝন No member named AD in Bফলাফল হিসাবে আপনাকে একটি ত্রুটি দিয়েছে । স্নিপেট # 2 এর মতো, ঠিক কখন সদস্যের ওরফে ঘোষণা তাত্ক্ষণিকভাবে শুরু করা হবে তা আমি খুঁজে পাচ্ছি না। তবে, স্থিতিশীল ডেটা সদস্যদের সংজ্ঞা থেকে ভিন্ন, কোনও শ্রেণীর টেম্পলেটের অন্তর্নিহিত ইনস্ট্যান্টিশনের সময় সদস্যের ওরফে ঘোষণার ঝলক স্পষ্টভাবে প্রতিরোধ করার জন্য কোনও শব্দ নেই। সুতরাং, আমি বলব যে জিসিসি এবং ঝনঝন উভয়ের আচরণই এই ক্ষেত্রে মানদণ্ডের একটি বৈধ ব্যাখ্যা ...


ধন্যবাদ। এই ক্ষেত্রে, আমরা শরীরের মধ্যে স্থিতিশীল ডেটা সদস্যকে সূচনা করি। সূচনাটি কি ঘোষণার অংশ, না স্ট্যাটিক ডেটা সদস্যের সংজ্ঞার অংশ? আমি ছাপে ছিলাম যে যদি সূচনাটি শরীরের মধ্যে থাকে তবে এটি স্ট্যাটিক ডেটা সদস্যের ঘোষণার অংশ। এটি যদি ঘোষণার অংশ হয়, তবে শ্রেণীর টেম্পলেটটির আশেপাশের অন্তর্নিহিত ইনস্ট্যান্টেশনের অংশ হিসাবে আপনার প্রথম উদ্ধৃতিতে অবিলম্বে তাত্ক্ষণিক প্রয়োজন।
জোহানেস স্কাউব - লিটব

আমি অনুমানটি দেখেছি এবং এটি C ++ 14 এবং C ++ 17 এর মধ্যে পার্থক্য বলে মনে হচ্ছে। সি ++ 14 এ constexprস্থিতিশীল ডেটা সদস্য ছিল কেবল একটি ঘোষণা। সি ++ 17 inlineভেরিয়েবল অর্জন করে এবং constexprতা বোঝায় inlineএবং এটি দেহটির স্থিতিশীল ডেটা সদস্য ঘোষণাকে একটি সংজ্ঞা দেয়।
জোহানেস স্কাউব - লিটব

eel.is/c++draft/dcl.spec.auto#4.senferences-2 বলছে "একটি স্থানধারক প্রকারটি ব্যবহার করে ঘোষিত ভেরিয়েবলের ধরণটি তার আরম্ভকারী থেকে নেওয়া হয় an আরম্ভের ঘোষণায় এই ব্যবহারের অনুমতি দেওয়া হয় ([ডিসিএলসিএল)। একটি ভেরিয়েবল এর)। সুতরাং আমি যুক্তি দিয়ে বলব যে স্ট্যাটিক ডেটা সদস্যের সংজ্ঞা প্রয়োজন, কারণ এতে ইনিশিয়ালাইজার রয়েছে।
জোহানেস স্কাউব - লিটব

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

যদি এমন কিছু না থাকে যার জন্য নির্দিষ্টকরণের প্রয়োজন হয়, সংজ্ঞাটি তাত্ক্ষণিকভাবে তৈরি হয় না। তবে autoক্ষেত্রে, বিধি বলছে যে ঘোষণাটি অবশ্যই একটি প্রাথমিক ঘোষণা হতে হবে। এটি কেবল তখনই ঘটতে পারে যদি এটি জানা থাকে যে ঘোষণাটি একটি সংজ্ঞা (যতদূর আমি জানি .. আমি কিছু সময়ের জন্য আইনজীবী-জমি থেকে বাইরে এসেছি)। অতীতে, একটি অনুরূপ কেস ছিল এবং eel.is/c++ftft /temp.inst#2.senferences-3 যোগ করা হয়েছিল, যেখানে একটি ঘোষণাকে একটি সংজ্ঞা বলে যা "সংজ্ঞা হিসাবে পরিচিত" হিসাবে তাত্ক্ষণিকভাবে যুক্ত হয় সংজ্ঞাটি ইনস্ট্যান্ট করছে।
জোহানেস স্কাউব - লিটব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.