2013-06-18 27 views
5

Sau nhiều năm AS3, tôi đang cố gắng tìm hiểu lại C++. Tài liệu tham khảo vẫn cho tôi phù hợp.Không thể chuyển kết quả của hàm thành tham chiếu

Hãy xem xét các chức năng sau:

#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; 
} 

Bây giờ, cách làm như sau:

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

là tốt, nhưng f(get()) sẽ tạo ra các lỗi sau:

"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"

Tại sao vậy ? Có phải vì kết quả của một hàm là vô hình const?

+0

Đối với một lần tôi thích thông báo lỗi của gcc đối với tiếng kêu: số: st2: : danh sách > '' –

Trả lời

8

Khi bạn làm điều này:

f(get()); 

bạn vượt qua một tạm thời std::list<int>-f(). Tạm thời không thể liên kết với tham chiếu không phải const. Vì vậy, bạn có thể khắc phục điều này bằng cách chuyển tham chiếu const, vì bạn không muốn sửa đổi đối số.

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); 
    } 
} 

Lưu ý rằng điều này đòi hỏi bạn phải sử dụng một const_iterator, vì std::list::begin() const và tương ứng end() phương thức hoàn trả const_iterator s. Trong C++ 11 bạn có thể đơn giản hóa này để

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

hoặc thậm chí

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

Từ khóa: tạm thời –

+0

+1 cho câu trả lời rõ ràng –

-1

Đó là bởi vì lập luận của bạn là T &. Nó là T tiếp &, nó hoạt động tốt.

Một số trình biên dịch cũ đã làm cho phiên bản của bạn hoạt động dưới dạng tiện ích mở rộng - quy tắc có phần tùy ý và có để tránh ngạc nhiên. T & arg có nghĩa là loại OUT (hoặc INOUT), và nếu sửa đổi kết thúc trong một tạm thời, nó là một bất ngờ.

+0

và sự cố là gì? –

0

Bạn đang trả về một biến tạm thời std::list từ phương thức get(). Điều này không hiệu quả vì đối số của bạn không phải là const để hoạt động f.

Các vấn đề liên quan