ইসি_নোথ্রো_কনস্ট্রাক্টেবলের জিসিসি বাস্তবায়নে স্ট্যাটিক_কাস্টের প্রয়োজন কেন?


11

এখানে জিসিসি বাস্তবায়ন type_traitsকেন নেওয়া static_castদরকার?

template <typename _Tp, typename... _Args>
struct __is_nt_constructible_impl
    : public integral_constant<bool, noexcept(_Tp(declval<_Args>()...))> {};

template <typename _Tp, typename _Arg>
struct __is_nt_constructible_impl<_Tp, _Arg>
    : public integral_constant<bool,
                               // Why is `static_cast` needed here?
                               noexcept(static_cast<_Tp>(declval<_Arg>()))> {};

এই অসঙ্গতিটি অদ্ভুত বলে মনে হচ্ছে
bit ই

4
আপনার প্রাসঙ্গিক libstdc ++ মেলিং তালিকায় এ জাতীয় প্রশ্ন জিজ্ঞাসা করা উচিত
bit ই

উত্তর:


12

কোনও প্রকার হ'ল আর্গুমেন্ট তালিকা থেকে উদ্ভাবনযোগ্য ভেরিয়েবল ডিক্লেয়ারেশন থেকে গঠনমূলক not

T t(declval<Args>()...);

সুসংহত হবে এবং ব্যতিক্রম ছুঁড়ে না পরিচিত । বহুবচন আর্গুমেন্টের ক্ষেত্রে এটি রূপান্তর অভিব্যক্তির সু-গঠনের সুসংহত ও সংখ্যার সমতুল্য (মডেলো নো ডেস্কস্ট্রাকটিভিটি, এলডাব্লুজি 2116 দেখুন ) is

T(declval<Args>()...)

তবে একক যুক্তির ক্ষেত্রে অভিব্যক্তিটিকে castালাই-প্রকাশT(declval<Args>()) হিসাবে বিবেচনা করা হয় , যা প্রার্থনা করতে পারে এবংconst_castreinterpret_cast ; সুস্পষ্ট ব্যবহারের static_castঘোষণাপত্রের সমতা পুনরুদ্ধার করে।

একটি সুনির্দিষ্ট উদাহরণ হিসাবে , প্রকারগুলি বিবেচনা করুন:

struct D;
struct B { operator D&&() const; };
struct D : B {};

এখানে একটি static_castথেকে B constকরতে D&&রূপান্তর অপারেটর, কিন্তু একটি ঢালাই অভিব্যক্তি করতে পারেন রূপান্তর অপারেটর বাইপাস ব্যবহার করা আবশ্যক এবং তাই noexcept হয়। সুতরাং বাদ দেওয়া static_castভুল ফলাফল দেয় is_nothrow_constructible<D&&, B const>


সুতরাং static_castপ্রয়োজন তাই যাতে অভিব্যক্তিটি সর্বদা হিসাবে direct initializationপরিবর্তিত হিসাবে বিবেচিত হয় cast expression?
জোও পাইর্স

1
@ জোওপায়ারস হ্যাঁ, এটা ঠিক। এটি এখনও স্ট্যান্ডার্ড দ্বারা প্রয়োজনীয় যা ঠিক তা নয় কারণ অপারেটরটি ব্যবহার করে কোনও ঘোষণার বাইরে পরীক্ষা করা সম্ভব নয় noexcept, তবে এটি অনেক বেশি কাছাকাছি।
ইকামত্মর

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