You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 18:54:05