2015-06-13 105 views
2

std::string訪問者(backfrontat,和operator[])具有const和非const過載,如下:爲什麼std :: string的const訪問器返回一個引用?

char& x(); 
const char& x() const; 

爲什麼第二版本返回const參考,而不是簡單地返回char價值(作爲副本)?

根據rules of thumb on how to pass objects around,當不需要修改原始值時,不應該通過值傳遞小對象嗎?

+2

一個字:一致性(例如'std :: vector')。 – Simon

+0

爲什麼它應該與非const版本有不同的語義? – juanchopanza

回答

10

因爲調用者可能想要引用char,它反映了通過非const方法對它所做的任何更改。

std::string str = "hello"; 
char const& front_ref = static_cast<std::string const&>(str).front(); 
str[0] = 'x'; 
std::cout << front_ref; // prints x 
+0

更改爲const對象? – ixSci

+1

@ixSci:不可以。您可以對非const對象有一個const引用。看我更新的例子。 –

+0

當然,但是這看起來不是很過分嗎?我無法想象這種情況。 – ixSci

1

因爲上下文。

你正在處理一個容器和函數的名稱暗示特定的位置數據。

std::string s = "hello world?"; 
const auto& s1 = s.back(); 
s.back() = '!'; 

在這裏返回引用提供了靈活性,它也與非const變體和其他stl容器一致。所有這些功能實際上都是std::basic_string<char>的成員。

請記住,「經驗法則」是一條指引而非規則。

相關問題