次のコードを参照してください。
struct X;
struct Y {
Y() {}
Y(X&) = delete;
};
struct X {
X() {}
operator Y() {
return{};
}
};
int main() {
X x;
static_cast<Y>(x);
}
ここで、Y
を受け取る のコンストラクターX
は明示的に削除され、 whileX
には への変換演算子がありY
ます。これらの真っ向から対立する2つの中で、=delete
常に勝つようです。GCC、Clang、および VC++ のいくつかの最近のバージョンでテストしました。
質問: それは「正しい」動作ですか? 変換コンストラクターと変換演算子の間に特に優先順位はないと思ったので、上記のコードはオーバーロード解決のあいまいさエラーを生成するはずです。しかし、そうではありません。削除された機能の使用について文句を言います。コピーの省略が保証されているためですか?
グーグルで検索して、 Conversion constructor vs. conversion operator: precedenceを見つけました。その質問ではconst
、変換コンストラクターに が存在するため、より適切に一致するため、変換演算子が選択されています。ただし、私の場合、置き換えY(X&)
てY(X const&)
も何も変わりませんでした。
実際、私が望んでいる状況は次のとおりです。
X x;
Y y1(x); // Error
Y y2 = static_cast<Y>(x); // OK
X <- int&
はい、これをばかげていると呼ぶかもしれませんが、実際には、そのように動作する組み込み型がありますY <- int&&
。組み込みの参照型を正確に模倣するユーザー定義型を作成できないことは、現在の C++ では本当に必死に欠けている部分のようです...