2010-10-28 28 views
12

tôi có chức năng sauđi qua một chuỗi chữ để một chức năng mà phải mất một std :: string &

void AddNodeValue(XMLNode& node, std::string& value); 

Tôi muốn sử dụng nó như thế này:

document.AddNodeValue(modvalue,"modvalue"); 

và trình biên dịch phàn nàn:

error C2664: 'void XML::XMLDocument::AddNodeValue(XML::XMLNode &,std::string &)' : cannot convert parameter 2 from 'const char [9]' to 'std::string &' 
     A reference that is not to 'const' cannot be bound to a non-lvalue 

Tôi không hiểu tại sao điều đó sai?

Compiler: VS2003

Trả lời

23

Chức năng của bạn cần phải mất const std::string& để bạn có thể sử dụng nó như thế.

C++ có quy tắc rằng một giá trị (trong trường hợp của bạn, một tạm thời std::string được tạo từ chuỗi ký tự) có thể bị ràng buộc với tham chiếu const, nhưng không phải là tham chiếu không const. Theo tôi biết, hạn chế này không phải do bất kỳ vấn đề triển khai cơ bản nào, vì các giá trị tạm thời có thể được sửa đổi theo các cách khác. Nhưng một hàm lấy một tham chiếu không phải là const được giả định làm như vậy vì mục đích chính của nó là sửa đổi đối số đó. Nó thường không làm cho rất nhiều ý nghĩa để làm điều đó với một tạm thời, vì vậy có thể cấm nó bắt lỗi nhiều hơn nó ngăn cản người làm một cái gì đó đáng giá. Dù sao, không phải tất cả các giá trị đều là thời gian: một số là các giá trị thực sự không thể sửa đổi được.

Nếu bạn không thể thay đổi chức năng AddNodeValue thì bạn có thể làm việc xung quanh nó:

std::string valstr("modvalue"); 
document.AddNodeValue(modvalue, valstr); 
// valstr might have changed, check the documentation of AddNodeValue 
+0

Hạn chế về cơ bản tồn tại để thực thi các ngữ nghĩa tham khảo. Tham chiếu có nghĩa là được sử dụng với các đối tượng hợp lệ và liên tục. Chắc chắn bạn có thể tạo tham chiếu không hợp lệ bằng cách trả về tham chiếu đến giá trị cục bộ nhưng đó là lỗi ngữ nghĩa. –

+1

@Let_Me_Be: phải (giả sử bởi "tham chiếu" bạn có nghĩa là "tham chiếu không const" - rõ ràng là tham chiếu const không có nghĩa là chỉ được sử dụng với các đối tượng liên tục). Câu hỏi tiếp theo, sau đó, là * tại sao * tham chiếu không phải const được sử dụng với các đối tượng hợp lệ và liên tục, và AFAIK đó là vì nó thường không có ý nghĩa nhiều để sửa đổi các đối tượng không phải. C++ 0x cung cấp một kiểu tham chiếu mới cho các đối tượng có giá trị nhưng không bền vững, điều này rất tốt cho những dịp đó khi có ý nghĩa để sửa đổi các đối tượng đó. –

+0

Có, C++ 0x cung cấp tham chiếu giá trị l. Toàn bộ điểm tham chiếu (nội bộ vẫn là một con trỏ) là nó bị hạn chế rất nhiều (bằng cách bị ràng buộc với một số đối tượng hiện có, không null, vv ...). Vì vậy, tối ưu hóa thú vị hơn nhiều có thể được cung cấp bởi trình biên dịch. –

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