ทำไม `เดคไทป์ (static_cast <T> (…))` ไม่เสมอ 'T'


24

สำหรับรหัสต่อไปนี้ทั้งหมด แต่การยืนยันครั้งสุดท้ายผ่านไป:

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

นี่คือฮาร์ดโค้ดในคำจำกัดความของstatic_cast:

[expr.static.cast] (เหมืองที่เน้น)

1ผลการแสดงออกที่static_­cast<T>(v)เป็นผลมาจากการแปลงการแสดงออกในการพิมพ์v ถ้าเป็น lvalue ชนิดการอ้างอิงหรือการอ้างอิง rvalue ประเภทฟังก์ชั่นผลที่เป็น lvalue ; ถ้าเป็นการอ้างอิง rvalue กับชนิดของวัตถุผลลัพธ์จะเป็น xvalue มิฉะนั้นผลที่ได้คือค่าทั่วไป ผู้ประกอบการจะต้องไม่ทิ้ง constnessTTTstatic_­cast

decltype เคารพหมวดหมู่ค่าของตัวถูกดำเนินการและสร้างการอ้างอิง lvalue สำหรับการแสดงออก lvalue

การให้เหตุผลอาจเกิดจากชื่อฟังก์ชั่นของตัวเองมักจะเป็น lvalues ​​และดังนั้นการ rvalue ของประเภทฟังก์ชั่นไม่สามารถปรากฏ "ในป่า" ดังนั้นการคัดเลือกนักแสดงประเภทนั้นอาจไม่สมเหตุสมผล


คำถามนี้อยู่ในรายละเอียดเพิ่มเติม"rvalue [s] ของประเภทฟังก์ชั่น [ไม่] ปรากฏ [ไอเอ็นจี]" ในป่า ""
Eric
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.