【发布时间】:2021-09-15 13:34:59
【问题描述】:
C++ 中的一个类可以定义一个或多个转换运算符。其中一些可以自动推断结果类型:operator auto。所有编译器都允许程序员将任何运算符标记为已删除,operator auto 也是如此。对于具体类型,删除意味着尝试调用此类转换将导致编译错误。但是operator auto() = delete 的目的是什么?
考虑一个例子:
struct A {
operator auto() = delete;
};
struct B : A {
operator auto() { return 1; }
};
int main() {
B b;
A a = b; // error in Clang
int i = b; // error in Clang and GCC
int j = a; // error in Clang and GCC and MSVC
}
由于编译器无法推导出结果类型,它实际上禁止从此类或派生类进行任何转换,并出现错误:
function 'operator auto' with deduced return type cannot be used before it is defined.
演示:https://gcc.godbolt.org/z/zz77M5zsx
请注意,编译器在仍然允许的转换方面略有不同(例如,GCC 和 MSVC 允许转换为基类),其中哪一个是正确的?
【问题讨论】:
-
为澄清起见,您是否期望代码中的任何转换都不是错误?
-
澄清一下,并非所有允许的东西都一定有用。由于其他规则,有些事情是允许的,但没有任何实际应用。在这种情况下,我不确定是否有任何有用的应用程序。但值得注意的是,被允许并不意味着有用。
标签: c++ language-lawyer conversion-operator