2

const std::vector<const Array*> &objectsメソッドに引数として渡されるタイプのベクトルがあります。

const_cast したいのですが、なぜかできません。私が試してみました:

vector<const Array*> obj = const_cast<const std::vector<const Array*> >(objects);

他のいくつかの方法がありますが、文句を言い続けます。

何か案は ?

4

4 に答える 4

5

まず、しないでください。関数のシグネチャを変更して非定数参照を取得します。これを行うと、UBのリスクが高まります。

const std::vector<const Array*> myData = /* fill */;
yourFunction(myData); // try to modify my stuff and you get UB!

これで、何らかの理由(レガシーAPIなど)で実行する必要があるとまだ確信している場合は、次のように実行されます。

vector<const Array*>& obj = const_cast<std::vector<const Array*>&>(objects);

ここで、同じオブジェクトを参照しますが、objconst -qualifiedではありません。この時点で、すべてが明確に定義されています。UBであるconstオブジェクトを変更するだけなので、注意してください。objectsobj

于 2012-08-22T16:15:54.657 に答える
1

とにかくコンテンツをコピーコンストラクターしているので、ここでキャストする必要はありません。コピーコンストラクターはconst参照を受け入れます。

言うだけ:

std::vector<const Array*> obj = objects;
于 2012-08-22T16:17:50.577 に答える
1

それを反復する必要がある関数に渡す必要があります(変更は必要ありません)

を使用しconst_iteratorます。

const std::vector<const Array*>aを aにキャストしconst std::vector<const Array*>ますか? それらは同一ではありませんか。const を削除する場合:

std::vector<const Array*> obj = const_cast<std::vector<const Array*> >(objects);
//                                         |
//                                      no const

しかし、もっと重要な質問は次のとおりですobjectsである場合const、それを変更することは想定されていません。

于 2012-08-22T16:14:28.260 に答える
1

やりたいことがはっきりしている場合は、ベクトルへの非 const 参照を取得する方法を次に示します。

const std::vector<const Array*> &objects;

vector<const Array*>& obj = const_cast<std::vector<const Array*>& >(objects);
于 2012-08-22T16:20:01.100 に答える