Program farklı 3 büyük C derleyici derlenmiş. Hangisi doğru?
İlginç olarak takip (büyük pratik önemi olmasa da) önceki soruma: Why does C allow us to surround the variable name in parentheses when declaring a variable?
injected class name özelliği ile parantez bildiriminde birleştirerek şaşırtıcı sonuçlar derleyici davranışı neden olabileceğini öğrendim.
Aşağıdaki program 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 derleme bana aşağıdaki derleme hatası veriyor:
main.cpp:16:10: error: cannot call constructor 'C::C' directly [-fpermissive]
Başarıyla MSVC2013/2015 ile derler ve
C (B *)
yazdırırBaşarılı bir çınlama 3.5 " derler ve
C
yazdırır
Zorunlu soru hangisi doÄŸru? :)
(Ben şiddetle karşı çınlama versiyonu olsa sallandı ve typedef garip geliyor sadece tip teknik olarak değiştirdikten sonra değişkeni bildirmek durması için msvc)
CEVAP
GCC doğru, en az C 11 arama kurallarına göre. 3.4.3.1 [sınıf.kalite]/2, iç içe geçmiş eğer isim belirtici sınıf adı ile aynı ise, kurucu simgelediğini belirtir enjekte sınıf adı değil. Örnekler veriyor:
B::A ba; // object of type A
A::A a; // error, A::A is not a type name
struct A::A a2; // object of type A
Göründüğü gibi MSVC yanlış olarak işlev tarzı dökme ifadesi bir geçici C
y
olarak bir constructor parametresi; ve Çınlama yanlış olarak beyan bir değişken adı y
tipi C
.
Neden'sadece yorumlar farklı prog...
İyileştirme etkinleştirilmiş farklı ka...
Derleyici program içinde bazı satırlar...
Küçük Haskell programı büyük ikili içi...
Böyle büyük mükafat - configure: error...