T*&返回类型到底是什么

What in the world is T*& return type

本文关键字:是什么 返回类型      更新时间:2023-10-16

我一直在研究向量实现,偶然发现了一条线,让我困惑于作为一个天真的C++学习者。

  1. 什么是T*&返回类型?
  2. 这仅仅是对指针的引用吗?
  3. 那为什么这会有用呢?

代码链接:https://github.com/questor/eastl/blob/56beffd7184d4d1b3deb6929f1a1cdbb4fd794fd/vector.h#L146

T*& internalCapacityPtr() EASTL_NOEXCEPT { return mCapacityAllocator.first(); }
它是对
  1. 类型为T的值的指针的引用,该值作为模板参数传递,或者更确切地说:
    1. 存在一个VectorBase<T>实例,其中程序指定TT可以是intstring或其他任何东西。
    2. T值作为向量中的项存在。
    3. 可以创建指向该项的指针:T* pointer = &this->itemValues[123]
    4. 然后,可以创建对此指针的引用:https://msdn.microsoft.com/en-us/library/1sf8shae.aspx?f=255&MSPPError=-2147217396
  2. 正确
  3. 如果需要"间接"使用值,则引用到指针比指针到指针便宜,因为编译器/CPU 不需要执行双间接寻址。

http://c-faq.com/decl/spiral.anderson.html

这将是对 T 类型指针的引用。对指针的引用可能有点棘手,但在使用引用时会大量使用智能指针,从而将增量保存到引用计数器。

C++中的类型应从右到左读取。在此之后,它变为:对 T 指针的引用。所以你的假设是正确的。

对指针的引用非常有用,这通常用作输出参数或进出参数。让我们考虑一个特定的 std::swap 案例

template <typename T>
void swap(T*& lhs, T*& rhs) {
T *tmp = rhs;
rhs = lhs;
lhs = tmp;
}

与每种类型一样,它可以用作返回值。在状态库中,您可以找到std::vector<int *>::operator[]的返回类型,允许v[0] = nullptr

在我参与的项目中,我还没有看到这种允许更改内部结构的 getter 的太多用法。但是,它确实允许您编写单个方法来读取和写入成员的值。

在我看来,我会称之为代码异味,因为它使理解哪些调用者进行了实际修改变得更加困难。 当返回对成员的 const 引用时,故事当然会有所不同,因为这可能会阻止副本。尽管阻止指针的复制不会增加价值。