`ডিক্লাইপ টাইপ (স্ট্যাটিক_কাস্ট <টি> (…)) always সর্বদা` টি কেন হয় না?


24

নিম্নলিখিত কোডের জন্য, সর্বশেষ দৃser়তা ব্যতীত সমস্তগুলি পাস:

template<typename T>
constexpr void assert_static_cast_identity() {
    using T_cast = decltype(static_cast<T>(std::declval<T>()));
    static_assert(std::is_same_v<T_cast, T>);
}

int main() {
    assert_static_cast_identity<int>();
    assert_static_cast_identity<int&>();
    assert_static_cast_identity<int&&>();
    // assert_static_cast_identity<int(int)>(); // illegal cast
    assert_static_cast_identity<int (&)(int)>();
    assert_static_cast_identity<int (&&)(int)>(); // static assert fails
}

কেন এই সর্বশেষ দাবিটি ব্যর্থ হচ্ছে, এবং static_cast<T>সর্বদা ফিরে আসে না T?


আমি যোগ T_cast i{1};করি আমি পেয়েছি invalid initialization of non-const reference of type 'T_cast' {aka 'int (&)(int)'} from an rvalue of type '<brace-enclosed initializer list>', সুতরাং যে কোনও কারণেই T_castএটি একটি int (&)(int)পরিবর্তে int (&&)(int)
কেভিন 21

উত্তর:


21

এটি সংজ্ঞায় কঠোর কোডযুক্ত static_cast:

[expr.static.cast] (জোর আমার)

1 এক্সপ্রেশনটির static_­cast<T>(v)ফলাফলটি হ'ল এক্সপ্রেশনকে vটাইপে রূপান্তরিত করে Tযদি Tকোনও লভ্যালু রেফারেন্স টাইপ হয় বা ফাংশন প্রকারের জন্য কোনও মূল্যসূচক রেফারেন্স হয় তবে ফলাফলটি একটি মূল্য হয় ; যদি Tকোনও অবজেক্টের ধরণের ক্ষেত্রে কোনও মূল্যসূচক রেফারেন্স হয় তবে ফলাফলটি একটি xvalue হয়; অন্যথায়, ফলাফল একটি মূল্য আছে। static_­cast অপারেটর দূরে constness নিক্ষেপ করবে না।

decltype এর অপারেন্ডের মান বিভাগকে সম্মান করে এবং লভ্যালু এক্সপ্রেশনগুলির জন্য একটি লভ্যালু রেফারেন্স তৈরি করে।

যুক্তিটি ফাংশনটির নামগুলির কারণে তাদের সর্বদা লভ্য হতে পারে এবং তাই কোনও ফাংশনের ধরণের মূল্য "বন্যে" উপস্থিত হতে পারে না। যেমন, এই ধরণের কাস্টিং সম্ভবত বোধগম্য নয়।


এই প্রশ্নটির আরও বিস্তারিতভাবে "একটি ফাংশনের ধরণের [মূল] বিষয়গুলি [বুনোতে" উপস্থিত হবে না "প্রদর্শিত হবে")
এরিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.