2010-11-21 71 views
9

Tôi đang làm việc trên môi trường Linux gcc và tôi cần phải khởi tạo đối số hàm là các lớp có giá trị mặc định. Khi tôi làm điều đó với ví dụ tạm thời của lớp nó làm cho một lỗi như thế này: "đối số mặc định cho [chức năng lập luận] đã gõ [tên lớp] ví dụ:.cách khởi tạo đối số hàm là các lớp có giá trị mặc định

void foo(std::wstring& str = std::wstring()) 

lỗi: đối số mặc định cho ' std :: wstring & str' có kiểu 'std :: wstring' PS mã này được biên soạn mà không cần bất kỳ lỗi hoặc cảnh báo với VC++.

Làm thế nào tôi có thể initilize giá trị mặc định?

+0

em đang cố gắng để đạt được? Đối với tôi, có vẻ vô nghĩa những gì bạn đang làm .. – Simone

+0

@Simone -this có lẽ là một thử nghiệm để có được cả hai cuộc phiêu lưu của các giá trị mặc định và gửi bằng cách tham chiếu. – rkellerm

+0

ràng buộc với tham chiếu không const không tuân thủ tiêu chuẩn, nhưng VC++ cho phép nó như là một phần mở rộng AFAIK. –

Trả lời

8

Điều này được cho là không biên dịch. Bạn đang cố gắng ràng buộc một rvalue để tham chiếu không const. Nói std::wstring const & str và nó sẽ hoạt động.

9

Bạn chỉ có thể tạo ra một chức năng quá tải:

void foo() { 
    std::wstring str; 
    foo(str); 
} 

nhưng tôi thực sự bỏ lỡ vấn đề.

EDIT: Ý tôi là, mục đích của chức năng đó gần như chắc chắn là sửa đổi chuỗi đầu vào. Nếu bạn cung cấp một chuỗi đầu vào trống mà bạn không thể truy cập sau đó, tại sao lại bận tâm?

+0

Mục đích của chức năng cũng có thể lấy chuỗi đầu vào mà không sửa đổi nó. Việc đi qua tham chiếu cũng có thể được để ngăn chặn việc xây dựng bản sao từ được gọi. – rkellerm

+0

có nhiều tình huống có thể hữu ích, ví dụ: đây không phải là chuỗi, mà là bộ đệm hoặc một số dữ liệu (như nhật ký chi tiết) được đặt ở đó theo phương pháp nhưng bạn chỉ quan tâm đến kết quả. Tuy nhiên, giải pháp của bạn nhẹ nhàng giải quyết vấn đề với mã tuân thủ chuẩn :) –

+0

@ rursw1 có, nhưng - trong những trường hợp như vậy - nếu bạn không vượt qua tham chiếu ** const **, tôi nghĩ giao diện của hàm là bằng cách nào đó sai. – Simone

3

Bạn không thể liên kết các tham chiếu không phải const với giá trị. Đi ngang qua giá trị sẽ làm việc:

void foo(std::wstring str = std::wstring()) 

Hoặc đi qua bằng cách tham chiếu đến const:

void foo(const std::wstring& str = std::wstring()) 
+0

Tôi không thực sự hiểu câu cuối cùng của bạn. Ngay cả khi trình biên dịch không tối ưu hóa tạm thời và sao chép đắt tiền như thế nào là sao chép một chuỗi rỗng thực sự sẽ được? Và nếu tạm thời được elided, những gì còn lại để di chuyển? –

+0

@Charles: Điều gì xảy ra nếu người dùng * thực hiện * cung cấp chuỗi làm đối số? Sau đó, nó phải được sao chép trong C++ 03. – fredoverflow

+0

Xin lỗi, tôi nghĩ bạn đang đề cập đến việc sử dụng đối số mặc định trong nhận xét của bạn. Trong mọi trường hợp, nếu người dùng cung cấp một chuỗi tạm thời trong nhiều trường hợp, nó có thể được ưu tiên trong C++ 03. Một bản sao không phải lúc nào cũng phải xảy ra. –

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