টি কি `স্টাড :: ডিক্লভাল <টি> 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.