แม้ว่าฉันจะไม่พบการกล่าวถึงที่ชัดเจนในWorking Draft C ++ Standard (ตั้งแต่ปี 2014) ว่าการแปลงจากstd::nullptr_t
เป็นประเภทหนึ่งเป็นสิ่งต้องห้าม แต่ก็ไม่มีการกล่าวถึงว่าอนุญาตให้มีการแปลงเช่นนี้!
อย่างไรก็ตามกรณีของการแปลงจากstd::nullptr_t
ถึงbool
ถูกกล่าวถึงอย่างชัดเจน:
4.12 การแปลงบูลีนสามารถแปลง
ค่า prithue ของเลขคณิต, การแจงนับที่ไม่มีการกำหนดขอบเขต, ตัวชี้หรือตัวชี้ไปยังประเภทสมาชิกเป็น prvalue ของบูลประเภท ค่าศูนย์ค่าตัวชี้โมฆะหรือค่าตัวชี้สมาชิกโมฆะจะถูกแปลงเป็นเท็จ ค่าอื่นใดจะถูกแปลงเป็นจริง สำหรับ direct-initialization (8.5) prvalue ของ type std :: nullptr_t สามารถถูกแปลงเป็น prvalue ของ type bool; ค่าผลลัพธ์เป็นเท็จ
นอกจากนี้สถานที่เดียวในเอกสารฉบับร่างนี้ที่std::nullptr_t
กล่าวถึงการแปลงจากประเภทที่รวมอยู่ในส่วน "reinterpret_cast":
5.2.10 ตีความการร่ายซ้ำ
...
(4) ตัวชี้สามารถแปลงได้อย่างชัดเจนเป็นชนิดอินทิกรัลที่ใหญ่พอที่จะเก็บไว้ ฟังก์ชั่นการทำแผนที่มีการกำหนดใช้งาน [หมายเหตุ: มันมีจุดมุ่งหมายที่จะแปลกใจสำหรับผู้ที่รู้โครงสร้างที่อยู่ของเครื่องต้นแบบ - หมายเหตุท้าย] ค่าประเภท std :: nullptr_t สามารถแปลงเป็นประเภทอินทิกรัล การแปลงมีความหมายและความถูกต้องเช่นเดียวกับการแปลง (void *) 0 เป็นประเภทอินทิกรัล [หมายเหตุ: reinterpret_cast ไม่สามารถใช้เพื่อแปลงค่าชนิดใด ๆ เป็นชนิด std :: nullptr_t - บันทึกท้าย]
ดังนั้นจากการสังเกตการณ์ทั้งสองนี้เราสามารถคาดการณ์ได้อย่างสมเหตุสมผลว่า IM MSVC
คอมไพเลอร์นั้นถูกต้อง
แก้ไข : อย่างไรก็ตามการใช้ "สัญกรณ์การทำงานของคุณ" อาจแนะนำสิ่งที่ตรงกันข้าม! MSVC
คอมไพเลอร์ไม่มีปัญหาในการใช้ C- โยนสไตล์ในตัวอย่างเช่น:
uintptr_t answer = (uintptr_t)(nullptr);
แต่ (ในรหัสของคุณ) มันบ่นเกี่ยวกับเรื่องนี้:
uintptr_t answer = uintptr_t(nullptr); // error C2440: '<function-style-cast>': cannot convert from 'nullptr' to 'uintptr_t'
ยังจากมาตรฐานฉบับร่างเดียวกัน:
5.2.3 การแปลงประเภทอย่างชัดเจน (สัญกรณ์การทำงาน)
(1) ตัวระบุชนิดง่าย (7.1.6.2) หรือตัวระบุประเภทตัวพิมพ์ (14.6) ตามด้วยรายการนิพจน์วงเล็บที่สร้างขึ้นจะสร้างมูลค่าของประเภทที่ระบุให้กับรายการนิพจน์ หากรายการนิพจน์เป็นนิพจน์เดียวนิพจน์การแปลงประเภทจะเทียบเท่า (ตามที่กำหนดและหากกำหนดไว้ในความหมาย) กับนิพจน์การโยนที่สอดคล้องกัน (5.4) ...
"นิพจน์การโยนที่สอดคล้องกัน (5.4)" สามารถอ้างถึงการส่งแบบ C