2017-08-18 12 views
6
#include <iostream> 

struct Box 
{ 
    Box()   { std::cout << "constructor called" << std::endl; } 
    Box(const Box&) { std::cout << "Copy constructor called" << std::endl; } 
    Box(Box&&)  { std::cout << "Move constructor called" << std::endl; } 
    void run() const { std::cout << "Run" << std::endl;} 
}; 

int main() 
{ 
    Box a(Box()); 
    a.run(); 
} 

(demo) olarakYok ya <code>Copy Constuctor</code> veya <code>Move Constructor</code> argüman olarak anonim nesne <code>Box()</code> geçtiğin çağrılacak bekliyordum Yukarıdaki kodda argüman

Anonim Nesne geçirmeden üzerine denir. Ama hiçbiri çağrılmadı. Sebep muhtemelen copy elision olabilir. Ancak anonim nesne A() için bile kurucu çağrılmaz. Aslında, yukarıdaki kod derleme yapmıyor ve run() işlev derleyicisini çağırıyor. Biz Box a(Box()) yazdığınızda

a.cpp: In function ‘int main()’: 
a.cpp:28:7: error: request for member ‘run’ in ‘a’, which is of non-class type ‘Box(Box (*)())’ 
    a.run(); 

Yani ne oluyor? Neler yaratılıyor?

+3

MVP tarafından ısırıldınız. Kutu a (Kutu()), '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' adlı bir fonksiyonun beyanı olduğunu düşünüyor – Borgleader

+0

@YSC Biçimlendirmeye katılıyorum mu, emin değilim - önceki sürümü tercih ettim. – pingul

+1

@pingul kısa kodları SO üzerinde daha fazla ilgi çekmeye eğilimlidir ve benim düzenlemem OP'nin asıl amacını değiştirmez (umarım). Ama kesinlikle onu geri çağırmak için çağrı. – YSC

cevap

15

Bu, Most Vexing Parse örneğidir. Bir şey bir işlev beyanı olarak ayrıştırılabildiğinde, budur.

Box a(Box()) 

argüman olarak tip Box (*)() bir fonksiyonu alarak ve bir Box dönen a adında bir işlevin beyanıdır.

çözeltisi kullanmaktır (yeni C++ 11) aggregate initialization Nesnelerinizi yapımı için:

Box a{Box{}} 

(demo)


MVP en basit şekliyle tartışılmıştır sonra içinde bir ifade var ise bu stackoverflow soru Most vexing parse: why doesn't A a(()); work?

o geçerli. Örneğin:

((0));//compiles 

dil nasıl tanımlandığı hakkında daha fazla bilgi edinmek ve derleyiciler nasıl çalıştığı, sen sonlu durum makineleri gibi yaklaşık Formal language theory veya daha spesifik Context Free Grammars (CFG) ve ilgili malzemeyi öğrenmelidir. Eğer wikipedia sayfaları yeterli olmasa da, bir kitap almak zorunda kalacaksınız.

İlgili konular