为什么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
}
答案 0 :(得分:3)
typedef
和using
与#define
不同。它不是文本替换。当您使用typedef
或using
创建类型别名时,该名称将被视为单个单元。当您对其应用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>;
如果你这样做,为什么第一种解释是正确的可能会更有意义。