-1

更新: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ますか?

4

2 に答える 2

2

ここで何かを見落としていたら、申し訳ありません。しかし、あなたの質問はそれについて言及していないので、あなたが気づいていて、考えているかどうか疑問に思っています:

Foo defaultFoo (6502);
std::reference_wrapper<const Foo> theFooRef (getFooRef());
if (theFooRef.get().getBar() < 2000) {
    theFooRef = std::cref(defaultFoo);
}
// ...do stuff with theFooRef.get() or employ implicit cast...
于 2012-07-13T00:42:32.343 に答える
1

不格好になりたい場合は、 std::pair を使用してブール値を無視することができます:

これは、このコードが機能しないため、実行できない理由を明確に説明しています。const intではなくを使用const Fooしましたが、考え方は同じです。この行はそれが壊れている場所です:

theFooBool = std::pair<const Foo, bool> (defaultFoo, false);

const定義により、コピー代入はオブジェクトを変更するため、コピー代入演算子は宣言されていません。constオブジェクトを変更できないようにする場合に使用します。

もちろん、 を使用することもできます。これにより、アクセスできるようになりstd::reference_wrapper<const T>ますconstが、再バインドが可能になります。確かに、それは値のセマンティクスを提供しませんが、それはあなたが得ようとしているのと同じくらい近いです. 一般に、ほとんどの人はこれを必要とせず、望んでもいないので、まだ登場していません。

于 2012-07-13T00:41:40.137 に答える