std::unique_ptr 中运算符 * 的常量正确性

not*_*123 7 c++ const-correctness unique-ptr

为什么 std::unique_ptr 的 'operator*' 成员函数可以标记为 const ( https://en.cppreference.com/w/cpp/memory/unique_ptr/operator *) 而像 'front()'、 'back( std::vector 中的 )'、'operator[]' 等未标记为 const?两者都返回对其管理的资源的非常量引用。

核心问题是我无法理解第一部分,即为什么我们能够将“operator*”标记为 const,即当该函数中的“*this”指针是 const 时,返回类型如何为“T&”指针(由于函数被标记为 const)?

Dre*_*ann 6

区别在于容器的定义。

Astd::vector被视为容器。这意味着 a 管理的对象std::vector被视为向量的一部分

如果向量是 ,则从,front()返回的引用必须是。修改这些对象将修改矢量。back()operator[]constconst

std::unique_ptr然而,A不是容器。它管理的对象不被视为std::unique_ptr. 这意味着修改托管对象不被视为修改指针。

因此,operator*在指针类型上使用永远不会改变指针本身,因此始终可以考虑该操作const


std::optional可能会为这种差异提供一些有用的背景。

尽管其语法类似于指针,但它实际上是一个容器(max_size 为 1)。因为它包含其托管对象,所以operator*必须遵守const与容器相同的规则。