为什么const ref on non-const指针被解释为const指针?

时间:2016-01-20 06:15:10

标签: c++ c++11

为什么const PointerToNonConst& value被理解为A* const以下代码:

using PointerToNonConst = A*; // or typedef A* PointerToNonConst;
const PointerToNonConst& value; // compiled and understood as `A* const`

我原以为它是只读指针而不是常量指针。

BTW这是一个用例,为什么你可以在你的代码中遇到这个:

class A
{
public:
    void callOnNonConstMethodIsValid()
    {
        // change the object here
    }
}

std::vector<A*> vect;

for (const auto& elem : vect)
{
    elem->callOnNonConstMethodIsValid(); // no error
}

2 个答案:

答案 0 :(得分:3)

typedefusing#define不同。它不是文本替换。当您使用typedefusing创建类型别名时,该名称将被视为单个单元。当您对其应用const时,它会将该类型作为整体应用于顶层。您无法将其应用于该类型的内部组件。

答案 1 :(得分:2)

给出

using NonConstPtr = A*; // or typedef A* NonConstPtr;

声明

const NonConstPtr& value = <initializer>;

相当于

A* const& value = <initializer>;

value是对指向const类型的对象的A指针的引用。

它不等同于:

const A*& value = <initializer>;

其中value是对指向const A的指针的引用。

这是在类型之后使用const关键字更有意义的情况之一。

NonConstPtr const& value = <initializer>;

如果你这样做,为什么第一种解释是正确的可能会更有意义。