Önceki sorumun ilginç bir devamı olarak (yine de büyük bir pratik öneme sahip değil): C ++ neden bir değişken bildirirken değişken adını parantez içine almamıza izin veriyor?
Parantez içindeki bildirimi enjekte edilen sınıf adı özelliği ile birleştirmenin derleyici davranışıyla ilgili şaşırtıcı sonuçlara yol açabileceğini öğrendim .
Aşağıdaki programa bir göz atın:
#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 ile derlemek bana şu derleme hatasını veriyor:
main.cpp:16:10: error: cannot call constructor 'C::C' directly [-fpermissive]
MSVC2013 / 2015 ile başarıyla derlenir ve baskı yapar
C (B *)
Clang 3.5 ve baskılar ile başarılı bir şekilde derlenir
C
Öyleyse zorunlu soru hangisi doğru? :)
(Yine de clang sürümüne şiddetle eğildim ve teknik olarak türü değiştirdikten sonra değişkeni bildirmeyi durdurmanın msvc yolu, typedef biraz garip görünüyor)
C::C
bir türü adlandırmaz, bir işlevi adlandırır, bu nedenle GCC doğru imo'dur.
C::C y;
mantıklı değil, değil mi? Ne gelmezC::C (y);
ilk I azından bu Most-Vexing-Ayrıştırma örneğidir olduğunu düşünmüş stackoverflow.com/questions/tagged/most-vexing-parse , ama şimdi her üç derleyiciler olan anlamı sadece tanımsız davranış olduğunu düşünüyorum "doğru."