2016-12-09 18 views
2
struct A 
{ 
    // clang 3.8 error : cannot combine with previous 'static' declaration specifier 
    static mutable int n; 
}; 

私は、static mutable int n;は明確なセマンティクスを持っていることがあると思います。 なぜC++で許可されていないのですか?なぜ静的可変int n;ですか? C++では許可されていませんか?

更新:

別の例clear semanticsを示す:

class SharedValue 
{ 
public: 
    void Set(int n) 
    { 
     std::lock_guard lock(_mtx); 
     _n = n; 
    } 


    int Get() const 
    { 
     std::lock_guard lock(_mtx); 
     // 
     // _mtx should be mutable, 
     // because this is in const member function 
     // 

     return _n; 
    } 

private: 
    static mutable std::mutex _mtx; 
    int _n; 
}; 
+2

_ "場合によっては明確なセマンティクスを持っています" _これらのことを詳しく教えてください。私はあなたが何を意味するかは分かりません。 'static'は' const'や 'mutable'とは何の関係もありません。 –

答えて

7

あなたは言った:

// _mtx must be mutable, because this is in const member function 

を誤解だこと。 staticメンバ変数は、constメンバ関数で変更することができます。これは、前者がクラスの特定のインスタンスに関連付けられていないためです。したがって、staticメンバ変数に対するmutableという概念はあまり意味がありません。

4

staticクラスのメンバ変数がクラスのインスタンスにバインドされていません。
constクラスから値にアクセスして値を変更する動作が変更されるので、mutableは意味をなさないでしょう。あなたのアップデートを提供し、あなたの例として


は:

// _mtx should be mutable, 
// because this is in const member function 

std::mutex _mtx;staticメンバーではありません。 すべてのインスタンスをSharedValueにロックする必要はありませんが、現時点のもののみをロックする必要はありません。staticメンバーを変更可能にするには、mutable_mtxを提供する必要はありません。

staticキーワードを省略すると、mutable mutexを使用するのが一般的な手法です。

0

標準では、そのキーワードの組み合わせをサポートしていないため、明確な意味がありません。

元のCのキーワードには一般的にニーモニック値がありました。

現在のC++キーワードは、さまざまな意味を持つように再利用されています。複数の意味はstatic(あなたのキーワードの1つ)です。非staticメンバ関数のconst -nessが*thisconst -ness程度であり、staticデータメンバのconst -nessとは何の関係もないことを


注意。

我々はstaticデータメンバーに適用されるmutableためのいくつかの全く不自然ではない意味を定義した場合、それはstaticメンバ関数のためのconstに関連しなければならないであろう。もう一つの可能​​な言語拡張です。

static状態を保持する別のクラスを定義することで、変更可能性に関する制限を実装できます。

+0

downvoter、自分自身を明らかにする。ありがとうございました。 –

+0

まあ、私はこの答えに有益な情報を追加するつもりはありませんが、取得したすべてが匿名のばかだ。現在の2つの答えは少し欠けています。しかし、OPと読者は、他の誰かが気にしない限り、決して知らないでしょう。 –

関連する問題