标准模板库文档列表说:
void push_back(const T&x);
最后添加元素在列表末尾添加一个新元素,紧跟在当前最后一个元素之后.此新元素的内容初始化为x的副本.
这些语义与Java语义有很大不同,让我感到困惑.我错过了STL的设计原则吗?"一直复制数据"?这吓到我了.如果我添加对象的引用,为什么要复制该对象?为什么不只是传递的对象?
这里必须有一个语言设计决策,但我在Stack Overflow和其他网站上发现的大多数评论都集中在与所有这些对象复制都可以抛出异常这一事实相关的异常抛出问题上.如果你不复制,只是处理引用,那么所有这些异常问题就会消失.非常困惑.
请注意:在我使用的遗留代码库中,boost不是一个选项.
Dir*_*ple 11
STL始终存储您告诉它存储的内容.list<T>始终是一个列表,T所以一切都将按值存储.如果你想要一个指针列表,请使用list<T*>,这将类似于Java中的语义.
这可能诱使你尝试list<T&>,但这是不可能的.C++中的引用与Java中的引用具有不同的语义.在C++中,必须初始化引用以指向对象.初始化引用后,它将始终指向此对象.你永远不能指向另一个对象.这使得在C++中不可能有一个引用容器.Java引用与C++指针的关系更密切,因此您应该使用它list<T*>.
它被称为"价值语义".C++通常被编码为复制值,与Java不同,除了原始类型之外,复制引用.它可能会吓到你,但个人Java的参考语义让我更害怕.但是在C++中你有一个选择,如果你想要引用语义只需使用指针(最好是智能指针).然后,您将更接近您习惯的Java.但请记住在C++中没有垃圾收集(这就是你通常应该使用智能指针的原因).
| 归档时间: |
|
| 查看次数: |
7512 次 |
| 最近记录: |