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

  • discokatze

    discokatze

    23 EYLÜL 2009
  • paikimchung

    paikimchung

    12 Mayıs 2006
  • TotalSeminarsChannel

    TotalSeminar

    16 Mart 2010