对于此代码:
struct A {};
struct B {};
auto f() -> std::variant<A, B>
{
if (true) return A();
return B();
}
编译器是否可以自动将返回类型推导为
std::variant<A,B>
?
这样就可以省略返回类型声明:
auto f() // std::variant<A, B> deduced by compiler
{
if (true) return A();
return B();
}
不,这是不可能的。
仅当所有
return
语句返回相同类型时,自动返回类型推导才起作用,并且此处 A
和 B
不同。
以任何其他方式定义规则将非常困难(如果不是不可能的话)。
例如,在您的情况下,可能还有其他类型都可以由
A
或 B
构造,例如:
std::variant<A, B, std::monostate>
(或任何其他可以包含 std::variant
或 A
或任何其他类型的 B
)。std::any
.还可能有一些具有构造函数的自定义类 - 一个接受
A
,一个接受 B
。
所有这些示例都说明了为什么期望编译器将
variant<A, B>
推断为返回类型有点太多了。