constで非const型にキャストする


37

const_castを使用してconstを非constにキャストすることができます。

constconstにキャストする場合はどうすればよいですか?

39

const_castは、削除するために使用することができますまたはオブジェクトにconstnessを追加します。これは、特定のオーバーロードを呼び出す場合に便利です。

不自然な例:

class foo { 
    int i; 
public: 
    foo(int i) : i(i) { } 

    int bar() const { 
     return i;  
    } 

    int bar() { // not const 
     i++; 
     return const_cast<const foo*>(this)->bar(); 
    } 
}; 
  0

static_castまたはconst_cast? 02 5月. 112011-05-02 05:56:50

  0

@ Guillaume07おっと、申し訳ありません。 02 5月. 112011-05-02 05:57:27

+2

あなたのメソッドはすべての場合に機能しません... 'const_cast'はユーザクラス型のための特定のコンストラクタを必要とします。 23 3月. 132013-03-23 18:44:35

+4

@Geotargetあなたは間違っています。新しいオブジェクトは作成されません。したがって、利用可能なコンストラクタは重要ではありません。 23 3月. 132013-03-23 19:43:47

+4

'const_cast <const Type*>'は 'const'修飾子を追加する必要はありません。これは視覚的ノイズの10以上の余分な文字なので、この練習はIMO a Bad Idea™です。単に 'const foo * = obj;'を使ってください。 'const_cast'はほとんどの場合(ab)' 'const'を取り除くために使われます(http://stackoverflow.com/questions/3803521/question-about-const-cast-in-c)。 21 8月. 132013-08-21 11:52:10

+2

'const_cast'がこれに対して悪いと言っている人に関する注意として、このように' const_cast'を使うことは、コンストラクタのメンバ初期化で役に立ちます。ここで、constを追加するローカル変数を作ることはできません。さらに、私は、「視覚的ノイズ」は、コンスタンスに関して何か異常なことが起こっていることを明白にするのに役立つと主張します。しかし、おそらくあなたが邪悪な 'const_cast'に本能的に怒らないように、あなたが_adding_ constであることを明確にするためにコメントを追加するのが最善でしょう。 25 9月. 152015-09-25 11:45:22

  0

追加するだけです:constを追加することが暗黙的に行われることを指摘したので、static_cast <const VarType>(var) 'も使用できます。私は個人的にほとんどconst_castを使うことはほとんどありません。なぜなら、ほとんどの場合、あなたのコードのソフトウェアアーキテクチャ上の欠陥を補っているからです。だからconstを追加するときにはローカル変数のアプローチかstatic_castのどちらかを使って信号を送りますが、 21 4月. 162016-04-21 19:56:30


5

あなたが望むなら、それは本当に必要ではありません - non-constは暗黙的にconstに変換することができます - const_castを使用することができます。

+4

downvoteをした誰に:あなたは明らかにコメント、または指摘しようとするつもりはないので、なぜあなたはこれが間違っているとか、役に立たないと思っているのですが、少なくとももう一つ不注意なdownvoteをすることができますか?私のrepスコアは10の倍数になりますか? 02 5月. 112011-05-02 07:00:48

+1

私はあなたのバッジカウントが9-99-309であると読んでいます。 22 11月. 122012-11-22 08:48:57

+5

非「コンス」から「const」への暗黙的な変換は信頼できません。場合によっては明示的にする必要があります。例えば、メソッドは、 'const'nessの' reference_wrapper'の 'vector'を返すために、パラメータの' const'バージョンと非'const'バージョンを区別します。例えば、次のような宣言を考えてみましょう: 'template <typename Image> vector <reference_wrapper <typename条件式<is_const <Image> :: const、typename Image :: celltype、typename Image :: celltype :: :: get_subimage(int、int、Image& ); '。 23 10月. 132013-10-23 06:19:55


2

あなたはconstのパラメータ


2

const_castがあまりにもconstネスの動作を追加するために使用することができている機能に非constの引数を渡す場合は、暗黙の型変換を持っています。

cplusplus.comから:

鋳造このタイプのオブジェクトの const性を操作し、いずれか セットまたは削除することができます。

+2

の 'const_cast'は' cosnt_cast'ではありません。私は少なくとも10文字を変更する必要があるので編集できません:/ 06 10月. 142014-10-06 15:14:05


25

あなたはconstネスを追加するconst_castは必要ありません。

class C; 
C c; 
C const& const_c = c; 

詳細については、このquestion and answerをお読みください。


12

STLこれはC++ 17がこの場合正確にstd::as_constを提供するためです。

参照:http://en.cppreference.com/w/cpp/utility/as_const

用途:

CallFunc(as_const(variable)); 

の代わりに:

CallFunc(const_cast<const decltype(variable)>(variable));