C++中auto函数能否自动推导std::variant作为返回类型?
问题解答
不行,C++编译器没办法自动将这种情况下的返回类型推导为std::variant<A, B>,直接写auto f()会导致编译错误。
原因很明确:C++函数返回类型推导的规则要求,所有return语句的返回值类型必须能隐式转换到同一个确定的具体类型,编译器不会自动生成变体类型来兼容多种不同的返回类型。你的代码里,return A()和return B()返回的是两个完全独立、无隐式转换关系的结构体类型,编译器找不到一个能同时适配这两种类型的默认推导类型,因此会直接抛出类型不匹配的编译错误。
要让函数返回std::variant<A, B>,必须显式指定返回类型,比如你最开始的写法:
struct A {}; struct B {}; auto f() -> std::variant<A, B> { if (true) return A(); return B(); }
或者更简洁的写法:
std::variant<A, B> f() { if (true) return A(); return B(); }
这两种写法都是合法且正确的,而省略返回类型让编译器自动推导std::variant的写法在C++标准里是不被支持的。
内容的提问来源于stack exchange,提问作者hopeless-programmer
相关产品推荐
相关产品推荐

