序列容器(deque
,list
,vector
)具有push_back
的以下签名:
void push_back (const value_type& val);
void push_back (value_type&& val);
但basic_string
push_back
具有以下签名:
void push_back(CharT ch);
请注意缺少参考:参数为CharT
而不是const CharT&
或CharT&&
。
basic_string
X
满足standards say的要求,该要求规定应将容器(称为push_back
)t
定义为接受:
X::value_type
,类型rv
X::value_type
,类型disabled edit box / read-only text label
我不是很清楚,如何 有谁看到怎么样?感谢。
答案 0 :(得分:3)
我认为这是因为CharT
类型的简单性。它确实需要由reference
传递,因为reference
没有传递,所以不需要const
关键字。
在相反的std::vector
或std::list
中可能包含非常昂贵的复制对象。因此,它应该由reference
传递,然后const
是必不可少的。
答案 1 :(得分:2)
TLDR:值参数接受r值和l值,因此函数签名满足标准中的要求,定义函数将是非常愚蠢的签名传递参考。
关于为什么选择pass-by-value而不是引用传递的问题(为什么std::basic_string
应该满足序列容器的要求本身是另一个讨论):
99.999%的用例(char
,wchar
,char32_t
,...等)按值传递CharT
至少与传递一样有效在绝大多数情况下,通过引用和(忽略内联),使用引用的效率甚至更低,因为它添加了间接并且指针比大多数类似char的类型更大(确切的权衡取决于编译器,调用会议,建筑等)。
我个人意见:如果你有一个用例,那么
std::vector<CharT>
不够好