2011-06-07 15 views
7

Aşağıda bir örnek kod var. eğlenceli işlev derlenmeyecektir iken XYZ yapıcı olmayan const referans olarak argüman alır rağmen Yukarıdaki koddaYapıcım neden argüman olarak referans değil, geçici nesnelerle çağrılmasına izin veriyor?

#include<iostream> 

template<typename T> 
class XYZ 
{ 
    private: 
    T & ref; 
    public: 
    XYZ(T & arg):ref(arg) 
    { 
    } 
}; 
class temp 
{ 
    int x; 
    public: 
    temp():x(34) 
    { 
    } 
}; 
template<typename T> 
void fun(T & arg) 
{ 
} 
int main() 
{ 
    XYZ<temp> abc(temp()); 
    fun(temp()); //This is a compilation error in gcc while the above code is perfectly valid. 
} 

, gayet derler. Bu g ++ derleyici veya C++ standart için belirli bir şey hakkında söylemek zorunda mı?

Düzenleme:

gr ++ -v bu verir.

gcc versiyon 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)

+0

: olarak işlev şablonu tanımlar. – Gabe

cevap

12
XYZ<temp> abc(temp()); 

O, derler. Aslında onun bir işlevi beyanı olduğu zaman onun bir değişken beyanı olduğunu düşündüğünüze eminim. İşlevin adı abc; işlev, XYZ<temp> türünde bir nesne döndürür ve sırayla temp türünde dönen ve argüman almayan bir işlev olan bir (adsız) bağımsız değişken alır. temp() geçici bir nesne ve geçici bir nesne oluşturur çünkü

Ve fun(temp()) derlemek etmemekle: detay açıklama için bu konulara bakın const olmayan referansa bağlı olmak.

Yani düzeltme şudur: Kullandığınız ++ Sen g ne versiyonunu belirtmelidir

template<typename T> 
void fun(const T & arg) //note the `const` 
{ 
} 
+1

Nawaz, şuradasınız. MemberFun adında başka bir üye işlevi eklediğimde ve abc kullanarak bunu çağırmayı denediğimde, şu hatayı aldım "temp.cpp: 41: 8: error: 'abc' içindeki 'memberFun' için üye olmayan, sınıf dışı bir tür olan ' XYZ (temp (*)()) " – chappar

+0

@chappar: Tam olarak. 'abc'' XYZ ' türünde bir nesne değildir. Bu nedenle, 'abc' kullanarak' XYZ ' işlevini çağıramazsınız. – Nawaz

5

Resim standart olmayan const referans geçici geçmesine izin vermez. (C++ 0X, bazı kontrollü durumlarda bu duruma izin vermek için rvalue referansı getirmiştir), bkz. 8.5.3/5 (hangisi benim için çok uzunsa, anlamlı kısım ise, referans uçucu olmayan bir yapıya ait olacaktır) yazın, ancak burada uygulanmadıklarını öğrenmek için tüm vaka listesini okumanız gerekir).

Ve

XYZ<temp> abc(temp()); 

en can sıkıcı ayrıştırmasına sade fakat başka bir örnektir. Bir değişken beyan DEĞİLDİR çünkü

+2

Bu sorunun yarısını cevaplıyor. – Beta

İlgili konular