2013-06-18 10 views
5

Yıllarca süren AS3, C++'yi yeniden denemeye çalışıyorum. Referanslar hala bana uyuyor.İşlev sonucu başvuru olarak iletilemiyor

aşağıdaki işlevleri göz önünde bulundurun: yapıyor, Şimdi

#include <cstdio> 
#include <list> 

void f(std::list<int>& v) { 
    for (std::list<int>::iterator i = v.begin(); i != v.end(); ++i) 
    printf("Hello %d\n", *i); 
} 

std::list<int> get(void) { 
    std::list<int> list; 
    list.push_back(0); 
    return list; 
} 

aşağıdadır:

std::list<int> l = get(); 
f(l); 

iyi, ama f(get()) aşağıdaki hata üretecektir: olmasıdır Neden

"no matching function for call to 'f'", "candidate function not viable: no known conversion from `'std::list<int>' to 'std::list<int>&' for 1st argument"

? Bir işlev sonucu görünmez const olduğu için mi? Bunu yaptığınızda

+0

Bir kerelik için gcc'nin hata iletisini clang'ın: 'hata: const olmayan başvuru türünün 'std :: list > &' türünden geçici olarak başlatılmasını 'std: : liste > '' –

cevap

8

:

f(get()); 

geçici bir std::list<int> f() geçmektedir. Geçici olmayan bir referansa bağlanamaz. Bu nedenle, bağımsız değişkeni değiştirmek istemediğiniz için, bir const başvurusu geçirerek bu sorunu çözebilirsiniz. bu std::list::begin() const ve ilgili end() yöntem dönüşü const_iterator ler beri, bir const_iterator kullanmanızı gerektireceğini

void f(const std::list<int>& v) 
{ // ^^^^^ 
    for (std::list<int>::const_iterator i = v.begin(); i != v.end(); ++i) 
    { //     ^^^^^^^^^^^^^^ 
    printf("Hello %d\n", *i); 
    } 
} 

Not. C++ 11 size

for (auto i = v.begin(); i != v.end(); ++i) 
    ... 

veya argüman T & çünkü bile

for (const auto& i : v) 
    std::cout << i << "\n"; 
+1

Anahtar sözcük: –

+0

+1 sorunu nedir? –

-1

bu kolaylaştırabilir. Bu T & oldu, iyi çalıştı.

Bazı eski derleyiciler sürümünüzü uzantı olarak çalıştırdılar; kural bir şekilde keyfi ve beklenmedik bir durum var. T & arg, OUT (veya INOUT) türü anlamına gelir ve değişiklikler geçici olarak sonuçlanırsa, bu bir sürprizdir.

+0

numaralı açık yanıt için geçici –

0

get() yönteminden geçici bir std::list değişkeni döndürüyorsunuz. Bu çalışma, argümanınızın f işlevini yerine getirmesi için const olmadığı için işe yaramıyor.