SORU
16 NİSAN 2015, PERŞEMBE


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);
}
  1. 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]
    
  2. Başarıyla MSVC2013/2015 ile derler ve C (B *) yazdırır

  3. Baş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
16 NİSAN 2015, PERŞEMBE


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Best Quality Cartoons

    Best Quality

    10 ŞUBAT 2014
  • magnum33563

    magnum33563

    8 NİSAN 2011
  • Ryan Billy

    Ryan Billy

    30 EKİM 2006