【发布时间】:2018-06-29 20:19:15
【问题描述】:
请看以下代码:
struct X;
struct Y {
Y() {}
Y(X&) = delete;
};
struct X {
X() {}
operator Y() {
return{};
}
};
int main() {
X x;
static_cast<Y>(x);
}
这里,Y 的构造函数采用X 被显式删除,而X 有一个转换运算符到Y。在这两个直接矛盾的地方,似乎=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++ 中非常缺失的部分......
【问题讨论】:
-
你不是已经有了想要的情况吗?请注意,您可以直接调用转换运算符,如
Y y2 = x.operator Y();
标签: c++ c++11 conversion-operator deleted-functions