std::map
documentationによれば、キーと値のペアはstd::pair<const Key, Value>
に格納されているため、マップのキーはconstです。なぜstd :: mapのキーをnon-constを期待する関数に渡すことができますか?
ここで私はstd::map
を持っていると想像してください。ここで、キーはいくつかのオブジェクトへのポインタです。
struct S {};
struct Data {};
using MyMap = std::map<S*, Data>;
のもS*
パラメータを受け付ける関数foo
があると仮定しましょう。
void foo(S* ptr) { /* modify the object (*ptr) */ }
さて、質問です:私はとMyMap
を反復処理するときに、範囲ベースのforループ、私はfoo
にマップ要素のキーを渡すことができる午前:
MyMap m = getMyMapSomehow();
for (auto elem : m)
{
static_assert(std::is_const<decltype(elem.first)>::value, "Supposed to be `const S*`");
foo(elem.first); // why does it compile?
}
だから、でも私をかかわらず、 static_assert
が成功します(したがって、elem.first
のタイプがconst S*
であると仮定します)、foo
への呼び出しはうまくコンパイルされます。したがって、ポインタからconstへの背後にあるオブジェクトを変更できるかのように見えます。
なぜ私はそれを行うことができますか?
P.S.ここに私の要点を示すlive example at Coliruがあります。簡潔にするため、S
とData
の代わりにint
を使用します。ここで
要素のコピーを作成しています。あなたはその個人的なコピーであなたが望むものを何でもすることができます... –
constへのポインタと不変なポインタを混同しないでください! –
@KerrekSBああ、確かに!私の脳は私の仕事日の終わりに私を混乱させる:)ありがとう! –