(更新:const Foo
この質問は、との異なる意味を持つオブジェクトの値によって渡されるラッパークラスの実装に由来します。これは、ここの人々からの強い意見に完全にFoo
基づいた動きです。やって来たので、それをとに交換しました。 機械的な置換が意味をなさないことは明らかです。そして、などのより複雑なものが必要になります...それを正しく書く方法はわかりませんが誤解をお詫びしますが、実際には多くの質問よりも明らかになると思うので、ここに残しておきます。)const Foo*
Foo*
Wrapper<Foo>
const Wrapper<Foo>
Wrapper<Foo>
Wrapper<const Foo>
この質問を調べてみると、これはできないという考えと平行しているように見えました。
const Foo defaultFoo (6502);
const Foo theFoo (getConstFoo()); // returns const Foo for privilege reasons
if (theFoo.getBar() < 2012) {
theFoo = defaultFoo; // Error.
}
// ...you want to do const-safe methods with theFoo...
参照と同様に、const値を再ターゲットすることはできません。次のことを行うとコンパイルされますが、私が(この種のシナリオで)意図していることではありません。
Foo defaultFoo (6502);
Foo& theFooRef (getFooRef());
if (theFooRef.getBar() < 2000) {
theFooRef = defaultFoo; // Not an error, but not a retarget.
}
// ...you want to do stuff with theFooRef...
(私の理解から)reference_wrapper
次のようなもので、リファレンスケースでこれを回避できるようです:
Foo defaultFoo (6502);
std::reference_wrapper<Foo> theFooRef (getFooRef());
if (theFooRef.get().getBar() < 2000) {
theFooRef = std::ref(defaultFoo);
}
// ...do stuff with theFooRef.get() or employ implicit cast...
value_wrapper
似たようなことをする""がそこにあるのだろうか。const-correctnessの理由でconstである値でアイテムを保持する変数が必要なのは、私には合理的だと思います...変更しないからではありません。 (たとえば、前のノードを関数に渡すことが新しいノードを取得する方法である、そのツリー内のノードへのconstアクセスしか持たないにもかかわらず、プレオーダーツリーウォークで現在のノードを追跡するなど)
不格好になりたい場合は、 :を使用std::pair<const Foo, bool>
して無視することができます。bool
const Foo defaultFoo (6502);
std::pair<const Foo, bool> theFooBool (getConstFoo(), false);
if (theFooBool.first.getBar() < 2012) {
theFooBool = std::pair<const Foo, bool> (defaultFoo, false);
}
// ...do const-safe methods with theFooBool.first...
しかし、私自身のバージョンの ""を実装する以外に、これに対処するためのより良い方法はありvalue_wrapper
ますか?