12

const非constオブジェクトに追加するには、どちらが推奨される方法ですか?const_cast<T>またはstatic_cast<T>。最近の質問で、誰かが使用することを好むと述べましたが、それによってコードの意図がより明確になるstatic_castと思いました。では、変数constを作成するconst_castために使用するための引数は何ですか?static_cast

4

4 に答える 4

17

どちらも使用しないでください。オブジェクトを参照するconst参照を初期化します。

T x;
const T& xref(x);

x.f();     // calls non-const overload
xref.f();  // calls const overload

または、Boostで提供されてimplicit_castいるような関数テンプレートを使用します。

T x;

x.f();                           // calls non-const overload
implicit_cast<const T&>(x).f();  // calls const overload

との間の選択を考えるstatic_castconst_caststatic_cast間違いなく望ましいです。 それができる唯一のキャストであり、恒常性を捨てるのは本質的に危険であるため、恒常性を捨てるためにconst_castのみ使用する必要があります。constnessをキャストして取得したポインタまたは参照を介してオブジェクトを変更すると、未定義の動作が発生する可能性があります。

于 2010-08-04T03:15:46.800 に答える
3

static_castconstからconst(安全)へのキャストのみが可能であり、他の方向(必ずしも安全ではない)へのキャストはできないため、望ましいと思います。

于 2010-08-04T03:16:47.170 に答える
2

これは、 implicit_cast関数テンプレートの良いユースケースです。

于 2010-08-04T03:20:16.383 に答える
1

あなたはあなた自身のキャストを書くことができます:

template<class T>
const T & MakeConst(const T & inValue)
{
    return inValue;
}
于 2010-08-04T08:47:15.843 に答える