কলঙ্ক কোড সংকলন করে না তবে জিসিসি এবং এমএসভিসি এটি সংকলন করে


14

সমস্যাটি কী তা আমি বুঝতে পারি না: হয় আমার কোডে বা সংকলকটিতে (কম সম্ভব)। এখানে কোডের একটি অংশ রয়েছে:

#include <iostream>
#include <type_traits>
#include <set>


template<typename T, typename = void>
struct TestA: std::false_type {};

template<typename T>
struct TestA<T, std::void_t<typename T::reverse_iterator>> : std::true_type {};

template<typename T>
struct TestA<T, std::void_t<typename T::dummy_iterator>> : std::true_type {};

int main()
{
    std::cout << TestA<std::set<int>>::value;
}

জিসিসি এবং এমএসভিসি উভয়ই এটি সংকলন করে। আমি এটি জিডিসি এবং এমএসভিসি 17 (স্থানীয়) এবং 19 এর বিভিন্ন সংস্করণ দিয়ে গডবোল্টে পরীক্ষা করেছি Here এখানে একটি লিঙ্ক দেওয়া হয়েছে: https://godbolt.org/z/Enfm6L

তবে কলং এটি সংকলন করে না এবং একটি ত্রুটিটি প্রকাশ করে:

redefinition of `'TestA<T, std::void_t<typename T::dummy_iterator> >'`

এবং আমি আগ্রহী - সম্ভবত স্ট্যান্ডার্ডের কিছু অংশ রয়েছে যেখানে এই কোডের অংশটি ভুল বা অন্য কিছু হতে পারে।


কীভাবে " স্ট্যান্ড :: সেট :: রিভার্স_াইটেটর" এবং "স্ট্যান্ড :: সেট :: ডামি_এইটরেটর" ক্ল্যাং হেডারে সংজ্ঞায়িত করা হয়?
এমভিডেলগৌজ

std :: set :: ডামি_এইট্রেটর মোটেও ঝনঝন শিরোনামে সংজ্ঞায়িত হয় না (আশা করি)। নীচে দেখানো সংজ্ঞা না থাকলে সমস্যাটি ডামি_এইটরেটর আপনি যে কোনও ক্ষেত্রে পরিবর্তন করতে পারেন এবং ফলাফলটি পরিবর্তন করতে পারে না।
আন্দ্রেই

ধন্যবাদ আন্দ্রেই, আমি উত্তরটি পড়েছি এবং এটি সত্যই আকর্ষণীয়
এমভিডেলগৌজ

উত্তর:


9

এটি খুব সম্ভবত সিডাব্লুজি 1558 এর সাথে সম্পর্কিত ।

একটি উলামের টেম্পলেট বিশেষায়নের মধ্যে অব্যক্ত যুক্তিগুলির চিকিত্সা 17.6.7 [টেম্পালিওস] এর বর্তমান শব্দ দ্বারা নির্দিষ্ট করা হয়নি। উদাহরণ স্বরূপ:

  #include <iostream>

  template <class T, class...>
    using first_of = T;

  template <class T>
    first_of<void, typename T::type> f(int)
      { std::cout << "1\n"; }

  template <class T>
    void f(...)
      { std::cout << "2\n"; }

  struct X { typedef void type; };

  int main() {
    f<X>(0);
    f<int>(0);
  }

টি সহ প্রথম_এর রেফারেন্সটি কি কেবল শূন্যের সমতুল্য, বা এটি কোনও বিকল্প ব্যর্থতা?

এটি একটি ত্রুটি যা এরপরে সম্বোধন করা হয়েছিল, তবে আপনি যে ক্ল্যাংয়ের সংস্করণ ব্যবহার করেছেন তা এখনও ঠিক বাস্তবায়ন করে না, এটি এখনও উভয় বিশেষত্বকে কেবল দ্বিতীয় তর্ক হিসাবে সংজ্ঞায়িত হিসাবে বিবেচনা করতে পারে voidএবং পুরো প্রতিস্থাপনের ব্যর্থতা না ঘটাতে পারে। কর্মক্ষেত্রটি হ'ল একটি প্লেইন ওরফে ব্যবহার না করা std::void_t, তার পরিবর্তে কিছুটা জটিল সংস্করণ

template <typename...> struct voider { using type = void; };
template <typename... T> using my_void_t = typename voider<T...>::type;

একটি শ্রেণিবদ্ধ টেম্পলেট (যা এখন ওরফে যার অর্থ দাঁড়ায়) এর জন্য বিকল্প ব্যর্থতা সংজ্ঞায়িত করা হয়। এটি আপনার উদাহরণের মধ্যে প্লাগ করা কলঙ্ক https://godbolt.org/z/VnkwsM কে সন্তুষ্ট করে


1
আরেকটি কার্যসংক্রান্ত প্রতিটি প্রয়োজনের জন্য বৈশিষ্ট্যগুলো তৈরি, এবং তারপর তাদের একটি ইন একত্রিত করতে হবে enable_ifসঙ্গে std::disjunction(বা একটি দফা প্রয়োজন)
AndyG

সাহায্য এবং রেফারেন্সের জন্য আপনাকে ধন্যবাদ! ক্ল্যাং এ ধরণের বাগ সম্পর্কে শুনে দুঃখ পেয়েছি। মজার হলেও, আমি ভেবেছিলাম যে আপনার অকার্যকর_টির প্রয়োগটি মানক। টেমপ্লেট আলিয়াসিংয়ের ধারণাটি গ্রহণ করতে পারে না।
আন্দ্রেই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.