Sebagai tindak lanjut yang menarik (meskipun tidak terlalu penting secara praktis) untuk pertanyaan saya sebelumnya: Mengapa C ++ memungkinkan kita untuk mengapit nama variabel dalam tanda kurung saat mendeklarasikan variabel?
Saya menemukan bahwa menggabungkan deklarasi dalam tanda kurung dengan fitur nama kelas yang disuntikkan dapat menyebabkan hasil yang mengejutkan terkait perilaku kompilator.
Lihat program berikut:
#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);
}
Mengompilasi dengan g ++ 4.9.2 memberi saya kesalahan kompilasi berikut:
main.cpp:16:10: error: cannot call constructor 'C::C' directly [-fpermissive]
Ini berhasil dikompilasi dengan MSVC2013 / 2015 dan mencetak
C (B *)
Ini berhasil dikompilasi dengan clang 3.5 dan cetakan
C
Jadi pertanyaan wajibnya adalah mana yang benar? :)
(Saya sangat bergoyang ke arah versi clang dan cara pnidui untuk berhenti mendeklarasikan variabel setelah hanya mengubah tipe dengan secara teknis typedef-nya tampak agak aneh)
C::C
tidak menamai jenis, ia menamai suatu fungsi, jadi GCC tepat.
C::C y;
tidak masuk akal, bukan? Begitu pulaC::C (y);
pada awalnya saya pikir ini adalah contoh dari Most-Vexing-Parse stackoverflow.com/questions/tagged/most-vexing-parse , tetapi sekarang saya pikir itu hanya perilaku tidak terdefinisi yang berarti ketiga kompiler "benar".