2013-11-09 30 views
6

standart C++ tipleri, uygun vektörlerin içine klonlanabilir sahipaşağıdaki gibi ifadeler olabilir, böylece, örneğin int veya char

struct STRUCT 
{ 
    STRUCT(int a){} 
}; 

STRUCT c = STRUCT(67); 
STRUCT d(13); 
STRUCT(77); 

Soru şudur: neden referans anonim yapı veya sınıf örneklerinden geçebiliriz, ancak standart türleri geçemiyoruz? derleyici bu izin veriyorsa

struct STRUCT 
{ 
    STRUCT(int a){} 
}; 

void func1(int& i){} 
void func2(STRUCT& s){} 
void func3(int i){} 
void func4(STRUCT s){} 

void main() 
{ 
    //func1(int(56)); // ERROR: C2664 
    func2(STRUCT(65)); // OK: anonymous object is created then assigned to a reference 
    func3(int(46)); // OK: anonymous int is created then assigned to a parameter 
    func4(STRUCT(12)); // OK: anonymous object is created then assigned to a parameter 
} 
+4

'func2' satırınız derlenmemelidir (ilk ile aynı nedenden dolayı). – Mat

+0

'void main()' standart dışıdır. –

+0

Uygun bir uyarı seviyesiyle, uyarı C4239: standart olmayan uzantı kullanılır: 'argüman': 'STRUCT' konumundan 'STRUCT &'; Bir const olmayan başvuru sadece bir lvalue'ye bağlanabilir. '/ W4' kullanıyor olmalısınız. –

cevap

2

, o zaman ++ derleyici standart uyumlu C değil. Const olmayan bir lvalue referansına geçici bir değer giremezsiniz. Kural bu. Hem clang hem de gcc, bu kodu func2(STRUCT(65)); için derlemez. C++ gelen 03

void func1(int&& i){} 

void func1(const int& i){} 

Legacy:

Bunun yerine alternatifler var edebilmek gerekiyordu bir const olmayan tip (int &i) A (lvalue) referans parametresini değiştirmek için daha sonra geçici bir nesne böyle geçirerek 56 olarak mantıksal değildir, çünkü değiştirilemez. Değeri salt okunur olarak gözlemlemesi gereken bir const türüne (const int &i) yapılan bir başvuru, daha sonra 52 gibi geçici bir değer geçirilmesi yasaldır.

C++ 11'de, const olmayan geçici bir nesneye && tarafından başvuruda bulunabilirsiniz.

5

Böyle bir hatayı içeren MS VC++ derleyicisini kullandığınız anlaşılıyor. :) Geçici başvuru nesnesini const referansıyla bağlamanız gerekir. Örneğin

const int &ri = 10; 

yazabilirsiniz ama

int &ri = 10; 

aynı kullanıcı tanımlı türleri için geçerlidir yazamayabilir. C++ olarak

const STRUCT &rs = STRUCT(10); 

STRUCT &rs = STRUCT(10); // the compiler shall issue an error. 
0

, anonim geçici nesne right-value.To argüman olarak bir sağ değeri kabul daima şunları yapabilirsiniz:

1) .void foo1 (TİP); //
değerine geçirme 2) .void foo2 (const TYPE &); // const başvuruyla geçirme
3) .void foo3 (TYPE & &); // 11 ++ c sağ değeri referans

Sizin "FUNC3" ve "func4" geçen tamam, değer geçirilecek bir argüman kabul.
Ancak, "func1" ve "func2" yalnızca bir sol değer referansı tarafından iletilen bir bağımsız değişkeni kabul edebilir. İsimsiz bir parametreyi iletmek yanlıştır.