2016-01-20 169 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

相關問題