请看以下代码:
struct X;
struct Y {
Y() {}
Y(X&) = delete;
};
struct X {
X() {}
operator Y() {
return{};
}
};
int main() {
X x;
static_cast<Y>(x);
}
在这里,Y
带有 an 的构造函数X
被显式删除,而X
有一个转换运算符 into Y
。在这两个直接矛盾的地方,似乎=delete
总是赢;我在一些最新版本的 GCC、Clang 和 VC++ 上进行了测试。
问题:这是“正确”的行为吗?我认为转换构造函数和转换运算符之间没有特别的优先级,所以上面的代码应该会产生重载解析歧义错误。但事实并非如此。它抱怨使用已删除功能。是因为保证复制省略吗?
我用谷歌搜索并找到Conversion constructor vs. conversion operator: priority。在那个问题中,选择了转换运算符,因为它是一个更好的匹配,因为存在const
于转换构造函数中。但是,就我而言,更换Y(X&)
为Y(X const&)
没有任何改变。
实际上,我想要的情况如下:
X x;
Y y1(x); // Error
Y y2 = static_cast<Y>(x); // OK
是的,有人可能会说这很傻,但确实有一些内置类型的行为就是这样:替代X <- int&
,Y <- int&&
。无法创建完全模仿内置引用类型的用户定义类型似乎是当前 C++ 中一个非常缺失的部分......