2016-01-20 183 views
1

为什么const PointerToNonConst& value被理解为A* const下面的代码:为什么const引用非const指针被解释为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 
} 
+1

当然是'A * const'... – ildjarn

回答

3

typedefusing不是#define。这不是文字替换。当您使用typedefusing进行类型别名时,该名称将被视为单个单元。当您将const应用于它时,它将整个类型应用于顶层。您不能将其应用于该类型的内部组件。

+0

具有完整意义,但在这种情况下,我读取'const NonConstPtr&value'作为非只读指针的只读引用。那么最后它是只读还是不是?这很混乱。那么阅读它的正确方法是什么? – Narek

+0

@Narek:如果你意识到在类型之前写入'const'实际上是语法中的特例,并且实际上应该在类型之后写入,那么可以从右至左读取C和C++类型。所以我会把它写成'NonConstPtr const&value',并将其读为*“value是对一个const NonConstPtr *的引用”。但是这个名字很混乱。它令人困惑的原因是因为您输入的名称类型:'“NonConstPtr”'。一个更准确的名字是''PointerToNonConst'' –

+0

然后声明看起来像这样:'PointerToNonConst const&value',可以被读为*“value是对const PointerToNonConst的引用”*。 –

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>; 

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

+0

它总是*在类型之后放置'const'更有意义。事实上,你甚至可以把它放在语法中是一个特例。 –

+0

@BenjaminLindley,我同意。我更喜欢在类型后面加上'const'。 –

+0

@RSahu如果有办法,我会接受你的答案。 – Narek

相关问题