টি কি `স্টাড :: ডিক্লভাল <টি> in ব্যবহার করার জন্য একটি সম্পূর্ণ ধরণের হতে হবে?


11

এই উদাহরণটি বিবেচনা করুন ( এখান থেকে আসছেন ):

#include <type_traits>
#include <iostream>
template <typename U>
struct A {
};

struct B {
   template <typename F = int>
   A<F> f() { return A<F>{}; }

   using default_return_type = decltype(std::declval<B>().f());
};

int main()
{
    B::default_return_type x{};
    std::cout << std::is_same< B::default_return_type, A<int>>::value;
}

এটি gcc9.2 তে কোনও ত্রুটি না দিয়ে সংকলন করে তবে gcc7.2 এবং ঝাঁকুনি 10.0.0 Bসম্পূর্ণ না হওয়ার বিষয়ে অভিযোগ করে । ঝাঁকুনির ত্রুটিটি হ'ল:

prog.cc:11:58: error: member access into incomplete type 'B'
   using default_return_type = decltype(std::declval<B>().f());
                                                         ^
prog.cc:7:8: note: definition of 'B' is not complete until the closing '}'
struct B {
       ^
prog.cc:16:8: error: no type named 'default_return_type' in 'B'
    B::default_return_type x{};
    ~~~^
prog.cc:17:35: error: no member named 'default_return_type' in 'B'
    std::cout << std::is_same< B::default_return_type, A<int>>::value;
                               ~~~^

1
প্রশ্নের শিরোনাম ত্রুটির সাথে মেলে না? আমার কাছে, দেখে মনে হচ্ছে জিসিসি অভিযোগ করেছে .f()। এটা বোধগম্য; অসম্পূর্ণ টাইপের Bকোনও সদস্য নেই f।
— এমসাল্টাররা 10:39

@ এসএমএলটাররা আমিও একই চিন্তা করেছি, তবে তবে এখানে আসল সমস্যাটি কী? আমি ধরে নেব যে একবার আপনি std::declvalএটির থেকে উদাহরণ পেয়ে গেলে আর কিছু যায় আসে না যদি প্রকারটি সম্পূর্ণ হয় বা না (এবং আমি অনুমান করি যে আমি এতে ভুল করছি)
— idclev 463035818

[expr.ref] / 2 (সি ++ 11) শ্রেণীর সদস্য অ্যাক্সেস সম্পর্কে বলেছেন: "প্রথম বিকল্পের জন্য (ডট) প্রথম প্রকাশের সম্পূর্ণ শ্রেণীর ধরণ থাকবে" । এবং Bসম্পূর্ণ বা সম্পূর্ণ হিসাবে বিবেচনা করা হয় না alias-declaration।
— ভাষা আইনজীবী

@ ল্যাঙ্গুয়েজএলয়েয়ার আপনার উদ্ধৃত বাক্যটি আমি খুঁজে পাইনি তবে কেবল "ক্লাসের সদস্য সম্পূর্ণরূপে ক্লাস সদস্যের প্রবেশাধিকার that শ্রেণীর সংজ্ঞাতে উপস্থিত না হলে"
— ইডকলভ 463035818

1
@ ল্যাঙ্গুয়েজএলওয়্যার ঠিক আছে তবে আমি সম্মত হই যে আমার ব্যাখ্যাটি বন্ধ ছিল এবং সি ++ 11 এর পরে কিছুটা পরিবর্তিত হয়েছে বলে মনে হচ্ছে যা উপরেরটিটিকে আরও নতুন মানের করে তবে সি ++ 11 এ নয়। উত্তর লিখতে কি আপত্তি করবেন?
— idclev 463035818

উত্তর:


9

ত্রুটির উত্সটি নয় std::declval, তবে অসম্পূর্ণ শ্রেণীর সদস্য অ্যাক্সেস।

সিডাব্লুজি 1836- এর রেজোলিউশন 2.5 বছর আগে মার্জ হওয়া পর্যন্ত , স্ট্যান্ডার্ডটির ক্লাস সদস্য অ্যাক্সেস এক্সপ্রেশন ( E1.E2) এ ক্লাসটি সম্পূর্ণ হওয়া প্রয়োজন ।
[expr.ref] / 2 সি ++ 11 এ :

প্রথম বিকল্পের জন্য (ডট) প্রথম এক্সপ্রেশনটির সম্পূর্ণ শ্রেণীর ধরণ থাকবে।

[expr.ref] / 2 +++ এ :

প্রথম বিকল্পের জন্য (ডট) প্রথম এক্সপ্রেশনটি সম্পূর্ণ শ্রেণীর ধরণের একটি গ্লুয়্যু হবে।

এবং কোনও শ্রেণি alias-declarationতার নিজের মধ্যে সম্পূর্ণ হিসাবে বিবেচিত হয় না member-specification।
[শ্রেণী.মেম] / 6+++++ এ :

ক্লাস-স্পেসিফায়ার বন্ধ }হওয়ার সাথে সাথে একটি শ্রেণিকে সম্পূর্ণ-সংজ্ঞায়িত অবজেক্ট টাইপ ([বেসিক.টাইপস]) (বা সম্পূর্ণ টাইপ) হিসাবে বিবেচনা করা হয় । শ্রেণীর সদস্য-নির্দিষ্টকরণের মধ্যে , ক্লাসটি ফাংশন বডি, ডিফল্ট আর্গুমেন্ট, নোসেপ্ট-স্পেসিফায়ার এবং ডিফল্ট সদস্য প্রবর্তক (নেস্টেড ক্লাসে এই জাতীয় জিনিস সহ) এর মধ্যে সম্পূর্ণ হিসাবে বিবেচিত হয় । অন্যথায় এটি নিজস্ব শ্রেণির সদস্য-নির্দিষ্টকরণের মধ্যে অসম্পূর্ণ হিসাবে বিবেচিত হয় ।


8

থেকে [declval] :

মন্তব্য সমূহ: টেমপ্লেট প্যারামিটার Tএর declvalএকটি অসম্পূর্ণ টাইপ করা যেতে পারে।

এই শব্দটি C ++ 11 সাল থেকে উপস্থিত রয়েছে (সুতরাং কম্পাইলাররা আগের মান অনুসারে কাজ করা সম্ভব নয়)


দুর্দান্ত, আমি যা আশা করছিলাম তা হ'ল। দেখে মনে হচ্ছে
— জিসিসি

@ প্রাক্তন অজ্ঞাত 666৩৩৮৮১৮: আমার প্রথম চিন্তাটি ছিল Tএকেবারে সম্পূর্ণ ধরণের হওয়া উচিত। খুশী আমি মান পরীক্ষা করেছি checked
— অ্যান্ডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.