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

  • Ben Vivona

    Ben Vivona

    24 Ocak 2010
  • Blue Lightning TV

    Blue Lightni

    9 EKİM 2011
  • Jon Reed

    Jon Reed

    14 AĞUSTOS 2006