なぜ曖昧さがないのですか?ここでオーバーロード解決時にconst左辺参照がconst rvalue参照よりも優先される理由
struct B {};
struct C {};
struct A
{
A(B const &, C const &) {}
A(B const &&, C const &&) = delete;
#if 0
A(B const &, C const &&) = delete;
A(B const &&, C const &) = delete;
#endif
};
B const b() { return {}; } // const result type may make sense
C const c() { return {}; } // for some user-defined types
int main()
{
A a0{B{}, C{}}; // I want to prohibit this
A a1{b(), c()}; // and this cases
B const bb{};
C const cc{};
A a2{b(), cc}; // But surely I also want to prohibit this
A a3{bb, c()}; // and this cases to compile
}
私はA
のインスタンスにB
とC
インスタンスへの左辺値のconst参照を格納します。もちろん、参照されたオブジェクトの存続期間がA
のインスタンスの生存期間を克服することを確実にしたいと思います。加えて、対応B &&
とC &&
にマッチしB const &&
とC const &&
ため、この私だけ= delete;
オーバーロードを達成するために
。
上記のアプローチは、変換コンストラクタ(つまり単項式)に対して完全に機能します。しかし、より高いアライテンスについては、関心のあるパラメータ(すなわち、#if 1
)の定数の基準バージョンを取り囲む、組み合わせ可能なすべての組み合わせを明示的に= delete;
する必要があることが分かります。
私は、「あいまいさがないのはなぜですか?」と思っています。なぜなら、あいまいさは、上記の場合に間違ったコードのコンパイルを防ぐべきだからです。
"なぜコンストラクタの呼び出しが混在している場合にあいまいさがないのですか?"
'B const &&'は左辺値にバインドされません。そのコンストラクタは 'a3'のためには実行可能ではありません。同様に 'a2'。 –
@ T.C。 'B const&'は任意の種類のrvalueにバインドします。 – Orient
はい、逆ではありません。それは全体のポイントです。 –