2015-06-13 33 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>的成员。

请记住,“经验法则”是一条指引而非规则。

相关问题