C++中`operator auto() = delete`的作用是什么?
关于
operator auto() = delete的作用及编译器实现标准判定 operator auto() = delete的实际作用
C++中operator auto是使用返回类型自动推导的通用用户自定义转换运算符,将其标记为删除(= delete)的作用如下:
- 对定义该运算符的类本身:完全禁止该类对象的所有用户自定义类型转换。任何对该类对象做隐式/显式类型转换的操作,都会匹配到这个通用的被删除转换函数,直接触发编译错误,无需逐个删除针对特定类型的转换运算符。
- 对派生类:由于基类的转换运算符会被继承,在做类型转换的重载决议时,基类被删除的
operator auto会和派生类自己定义的转换函数共同进入候选集,要么出现重载歧义,要么直接匹配到被删除的版本,导致派生类的类型转换操作也被禁用。
参考示例代码:
struct A { operator auto() = delete; }; struct B : A { operator auto() { return 1; } }; int main() { B b; A a = b; // Clang中报错 int i = b; // Clang和GCC中报错 int j = a; // Clang、GCC、MSVC中均报错 }
触发的典型报错信息为:
function 'operator auto' with deduced return type cannot be used before it is defined.
符合C++标准的编译器实现判定
针对示例中A a = b;的转换行为,GCC和MSVC的实现符合C标准要求:
派生类对象到基类对象的隐式转换属于标准转换序列,按照C标准的重载决议规则,标准转换序列的优先级高于用户自定义转换序列,所以该转换应该优先走派生类到基类的内置标准转换,不需要匹配用户定义的operator auto转换函数,不会触发报错。
Clang的实现存在缺陷,错误地将被删除的通用用户自定义转换函数纳入高优先级候选,导致合法的标准转换被拦截报错。
内容的提问来源于stack exchange,提问作者Fedor
相关产品推荐
相关产品推荐

