2017-10-05 135 views
1

如果我使用mutableconst指針這樣的:可變在C++常量指針

class Test 
{ 
    public: 
    mutable const int* ptr; // OK 
}; 

它的正常工作。

但是,如果我用這樣的:

class Test 
{ 
    public: 
    mutable int * const ptr; // Error 
}; 

錯誤:

prog.cpp:6:25: error: const 'ptr' cannot be declared 'mutable' 
    mutable int * const ptr; 
         ^
prog.cpp: In function 'int main()': 
prog.cpp:11:7: error: use of deleted function 'Test::Test()' 
    Test t; 
    ^
prog.cpp:3:7: note: 'Test::Test()' is implicitly deleted because the default definition would be ill-formed: 
class Test 
    ^
prog.cpp:3:7: error: uninitialized const member in 'class Test' 
prog.cpp:6:25: note: 'int* const Test::ptr' should be initialized 
    mutable int * const ptr; 

爲什麼編譯器給在第二種情況下的錯誤?

+3

是什麼錯誤消息說?這可能值得一讀。 – VTT

+0

@VTT http://ide.geeksforgeeks.org/PWB4ti – Jayesh

+1

*編輯您的問題*以包含構建錯誤。作爲文本逐字複製粘貼,全部完整。 –

回答

4

第二種情況會導致錯誤,因爲mutableconst不能混合; mutable只能與非常量數據成員一起使用。

適用於非參考非常量類型的非靜態類成員,並指定該成員不影響類的外部可見狀態(如常用於互斥,備忘緩存,延遲評估和訪問工具)。 const類實例的可變成員是可修改的。

順便說一句,下面的代碼會導致相同的錯誤。

class Test 
{ 
    public: 
    mutable const int x; // Error; 
    mutable int const x; // ditto; 
}; 

的第一種情況是好的,因爲const int*不是const指針,但指針const。這意味着可以修改指針本身,並且可以將其標記爲mutable。 (但是,您不能修改指針。)

指針const(例如mutable const int* const ptr;)也會導致相同的錯誤。

0

第一個是指向常量數據的指針,這意味着您可以更改指針以及它指向的位置,但不能更改它指向的數據。

第二個是常量指針爲非常量數據,這意味着您必須在構造函數中初始化指針,然後無法將其指向其他任何位置。它指向的數據可以修改。

mutable部分在這兩種情況下適用於指針,實際成員變量,不是指向數據。而且由於變量不能同時變爲可變和常量,所以你應該得到一個錯誤消息。

0

bugs.eclipse.org說的:

的可變符只能應用於類數據的名稱 成員(9.2)和不能應用於聲明的名稱const或 靜態的,不能應用於引用成員。

0
struct Test 
{ 
    const int* ptr; 
}; 

翻譯:「該結構具有一個部件的部件是一個指示器指針指向其可以不經由指針被突變的整數」

本身可以雖然突變,該指針指向一個不同const int

如果我們選擇一個非引用類型,這可能會更簡單,因此您可以從指向對象的類型中分離出成員的類型(在您的示例中爲指針)。現在

struct Test1 
{ 
    int value; 
}; 

,加入mutable關鍵字,以得到

struct Test2 
{ 
    mutable int value; 
}; 

只是意味着我們允許發生變異的成員即使在結構本身,否則常量

換句話說,所有這一切都在這兩種情況下是OK:

Test1 a { 123 }; 
Test2 b { 123 }; 

// now mutate the object through a non-const reference 
a.value = 42; 
b.value = 42; 

但這是不同的:

const Test1& ca = a; 
ca.value = 69; // NO, a member of a const object is const 

const Test2& cb = b; 
cb.value = 69; // OK, a mutable member of a const object 

所以,現在我們理解正在如何可變的應用中,考慮問題線:

mutable int * const ptr; 

這就是說ptr均爲 mutable(即使其對象的成員爲const成員也可以進行變異) const(即使當它是其成員的對象是非const的時候也不能被突變)。

兩個顯然是矛盾的。