ক্লাস বিশেষায়নের মধ্যে ঝনঝন / জিসিসি অসঙ্গতি


9

কাঠামোগত বাইন্ডিংয়ের জন্য C ++ 17 তে একটি কাস্টম শ্রেণীর জন্য বিশেষত্ব দেওয়ার tuple_size/ চেষ্টা করার সময় আমি এই সমস্যাটি জুড়ে এসেছি tuple_element

কোডটি নীচে জিসিসিতে সংকলন করে তবে ঝনঝনিতে নয় (উভয় ট্রাঙ্ক সংস্করণ, নীচের লিঙ্কটি দেখুন)।

#include <type_traits>

template<typename T, typename... Ts>
using sfinae_t = T;

template<typename T, bool... Bs>
using sfinae_v_t = sfinae_t<T, typename std::enable_if<Bs>::type...>;

template <typename T>
struct Test;

template <typename T>
struct Test<sfinae_v_t<T, std::is_integral_v<T>>> {};

void f() {
    Test<int> t;
}

https://godbolt.org/z/ztuRSq

এটি ঝাঁকুনির দ্বারা সরবরাহ করা ত্রুটি:

<source>:13:8: error: class template partial specialization does not specialize any template argument; to define the primary template, remove the template argument list

struct Test<sfinae_v_t<T, std::is_integral<T>::value>> {};

       ^   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1 error generated.

Compiler returned: 1

এটি কি কোনও সংকলকের মধ্যে বাগ আছে বা উপরের কোডটি কিছু ইউবিকে ডাকে?


3
এটি আরও সহজ করা যেতে পারে ।
এভগ

3
আইসিসি এবং এমএসভিসি উভয়ই পাশাপাশি সংকলন করতে ব্যর্থ হয়েছে।
ক্রিসম্মে

@Evg এটা এর বিস্ময়কর যে gccপ্রনয়ন, এটি যেমন এইজন্য কম্পাইল না এই ...
ম্যাক্স Langhof

1
FWIW এই অসুস্থ গঠিত যদি আমি সম্পূর্ণরূপে ভুল (একই কারণে যে নই হওয়া উচিত এই মন্দ গঠিত হয়)।
ম্যাক্স ল্যাঙ্গোফ

1
যেহেতু আমরা মানকে উদ্ধৃত করছি, আমি ভাষা-উকিল ট্যাগ যুক্ত করেছি।
গিলিয়াম র্যাকিকোট

উত্তর:


3

আমি নীচে যা বলছি ( ওল্ড পোস্টের অধীনে ) একটি ডিগ্রির সাথে সত্য হওয়া উচিত, তবে এটির সাথে আসল সমস্যাটি হ'ল এসফিনএইটি ভুলভাবে ব্যবহৃত হয়, সুতরাং আমি আর নিশ্চিত নই যে এটি জিসিসি-তে একটি বাগ is

একটি উপনাম ঘোষণা সর্বদা সফল হতে হবে, আপনি সেখানে SFINAE করতে পারবেন না, যেহেতু এটি কোনও শ্রেণি বা ক্রিয়াকলাপের ঘোষণা বা বিশেষত্ব নয় (যেটি আপনি বোঝাতে পারেন, যেহেতু আপনি এলিয়াস বিশেষজ্ঞ করতে পারবেন না)। যদি উপনামের ঘোষণাটি সফল না হয় তবে প্রোগ্রামটিটি খারাপভাবে তৈরি। অতএব সংকলকটি ধরে নিতে পারে যে এটির ক্ষেত্রে কখনই আসবে না যে আপনি যখন পর্যন্ত এটিকে কোনও টেমপ্লেট ইনস্ট্যান্ট করতে বাধ্য না করেন ততক্ষণে উলামের ঘোষণাটি সফল হয় না।

সুতরাং প্রোগ্রামারটির পক্ষে sfinae_v_t<T,...>সর্বদা এটি মনে করা পুরোপুরি গ্রহণযোগ্য T, যেহেতু এটি ঘটবে, যখন প্রোগ্রামটি অসুস্থ নয়। সুতরাং এটি দেখতে পাবে যে সমস্ত ক্ষেত্রেই প্রোগ্রামটি দুর্বল নয়, আংশিক বিশেষত্ব বিশেষীকরণ করে না এবং যেমন এটি আপনাকে বলবে যে এটি অ-গঠিত। (এটাই ঝনঝন করে)।

আমি মনে করি না যে সংকলক এটি করতে বাধ্য হয়েছে। এবং যদি এটি না হয় এবং কেবল "ওকে, sfinae_v_tকিছু ধরণের, যাই হোক না কেন thinks" মনে করে , তবে এটি পুনরায় ঘোষণার বিষয়টি স্পষ্ট নয়। সুতরাং আমি মনে করি যতক্ষণ না আমরা তাদের মধ্যে একটির তদন্ত করি ত্রুটি নিক্ষেপ না করায় কোনও ভুল নেই।

তবে আমরা যখন এটি ইনস্ট্যান্ট করি তখন হয় আমাদের সমস্যাটি হওয়া উচিত যে আমাদের একটি পুনঃসংশোধন হয়েছে বা std::enable_ifটেমপ্লেট যুক্তির উপর নির্ভর করে প্রোগ্রামটি দুর্বল হয়ে গেছে । জিসিসির তাদের কমপক্ষে একটি বাছাই করা উচিত তবে তাও হয় না।

এটি ছাড়া আরও সহজ উদাহরণেও একেবারে প্রযোজ্য নয় std::enable_if। সুতরাং আমি এখনও মনে করি এটি জিসিসিতে একটি ত্রুটি, তবে আমি যথেষ্ট মনে করি যে আমি এটি আর নিশ্চিত করে বলতে পারি না। আমি কেবল এটিই বলব, কেউ যেন বাগ হিসাবে রিপোর্ট করে এবং সিসি থেকে লোকেরা এটি সম্পর্কে চিন্তা করে।

পুরানো পোস্ট

এটি জিসিসিতে একটি বাগ। স্ট্যান্ডার্ডটি ফাংশন টেম্পলেটগুলিতে শ্রেণিক টেম্পলেট রূপান্তর করার জন্য আমাদের নিয়ম দেয় rules আংশিক ফাংশন টেম্পলেট অর্ডারে এটির ক্রিয়াকলাপটি যদি অন্যটির আগে আসে তবে এক শ্রেণির টেম্পলেটটি অন্যটির চেয়ে বেশি বিশেষায়িত is

আমি এখানে ফাংশন তৈরি করেছি এবং এখন জিসিসি দাবি করেছে যে তাদের কল করা অস্পষ্ট, সুতরাং এটিও বলতে হবে যে শ্রেণীর টেম্পলেটগুলি সমানভাবে নির্দিষ্ট are

দ্রষ্টব্য: সাবধানে মানটি পড়া, আমার মাথার সংকলক ঝাঁকুনির সাথে সম্মত।


হয় sfinae_v_t<T, std::is_integral_v<T>>এবং sfinae_v_t<T, !std::is_integral_v<T>>একই ধরনের হিসাবে গণ্য? শব্দার্থকভাবে, তারা না।
of

@ গুইলাউমারিচিকোট সম্ভবত সম্ভাব্য, তবে কেন আমি ঠিক তা বুঝতে চাই। উদাহরণস্বরূপ মানটিও বলেছে যে "আংশিক বিশেষত্ব ঘোষণার সময় নির্ভরশীল নামগুলি পরীক্ষা করা যায় না, তবে আংশিক বিশেষায়নের ক্ষেত্রে প্রতিস্থাপিত হওয়ার পরে তা পরীক্ষা করা হবে।" না তারা গড় কিনা একই ধরনের আংশিক বিশেষজ্ঞতা মধ্যে T বদলে যেহেতু পর সিদ্ধান্ত নেওয়া হয় sfinae_v_t<T>উপর নির্ভরশীল T? যে কোনও ক্ষেত্রে, তারা একই হবে না কারণ উভয়ই দু'জনে তৈরি হবে।
ofo

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

1
গভীর চিন্তা করছি, আমি দেখেছি এই থেকে এখানে । SFINAE টেম্পলেট এলিয়াসগুলির সাথে সূক্ষ্মভাবে কাজ করা উচিত, অন্যথায় এটিও কাজ template<bool B, typename T> enable_if_t = typename enable_if<B, T>::type;করবে না। আমি এগিয়ে গিয়ে জিসিসির বিরুদ্ধে বাগ ফাইল করব, তবে জিসিসি সেখানে ভুল আছে কিনা তা সত্যই নিশ্চিত নয়। ধন্যবাদ।
ofo
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.