จากการติดตามผลที่น่าสนใจ (ไม่ใช่เรื่องสำคัญในทางปฏิบัติ) สำหรับคำถามก่อนหน้าของฉัน: เหตุใด C ++ จึงอนุญาตให้เราล้อมรอบชื่อตัวแปรในวงเล็บเมื่อประกาศตัวแปร
ฉันพบว่าการรวมการประกาศในวงเล็บกับคุณสมบัติชื่อคลาสที่ฉีดเข้าด้วยกันอาจนำไปสู่ผลลัพธ์ที่น่าประหลาดใจเกี่ยวกับพฤติกรรมของคอมไพเลอร์
ดูโปรแกรมต่อไปนี้:
#include <iostream>
struct B
{
};
struct C
{
C (){ std::cout << "C" << '\n'; }
C (B *) { std::cout << "C (B *)" << '\n';}
};
B *y = nullptr;
int main()
{
C::C (y);
}
การคอมไพล์ด้วย g ++ 4.9.2 ทำให้ฉันมีข้อผิดพลาดในการคอมไพล์ต่อไปนี้:
main.cpp:16:10: error: cannot call constructor 'C::C' directly [-fpermissive]
คอมไพล์สำเร็จด้วย MSVC2013 / 2015 และพิมพ์
C (B *)
คอมไพล์สำเร็จด้วย clang 3.5 และพิมพ์
C
คำถามบังคับคือคำถามใดถูกต้อง? :)
(ฉันแกว่งไปทางเวอร์ชันเสียงดังอย่างมากแม้ว่าวิธี msvc จะหยุดการประกาศตัวแปรหลังจากเปลี่ยนประเภทด้วยเทคนิค typedef ดูเหมือนจะแปลก ๆ )
C::C
ไม่ได้ตั้งชื่อประเภทมันตั้งชื่อฟังก์ชันดังนั้น GCC จึงถูกต้อง imo
C::C y;
ไม่สมเหตุสมผลใช่มั้ย? ไม่ไม่C::C (y);
ในตอนแรกที่ผมคิดว่านี่คือตัวอย่างของส่วนใหญ่ที่รบกวน-แยกstackoverflow.com/questions/tagged/most-vexing-parseแต่ตอนนี้ฉันคิดว่ามันเป็นเพียงพฤติกรรมที่ไม่ได้กำหนดความหมายของทั้งสามคอมไพเลอร์มี "สิทธิ".