#include <optional>
#include <variant>
#include <utility>
#include <set>
int main()
{
std::optional<std::variant<std::pair<int, int>, std::set<int>>> foo(std::in_place, {1, 4});
}
- 这个编译通过了。但是这怎么可能呢,因为
std::variant
没有一个以std::initializer_list<T>
作为其第一个参数的构造函数,但是std::optional
的这个构造函数重载只是将初始化列表传递并将其他参数转发到内部类型构造函数? std::variant
现在持有哪种类型,std::set
还是std::pair
?
optional<T>
的in_place
构造应允许访问任何T
构造函数,包括初始化列表构造函数。variant<Ts>
应该可以从这些Ts
中的任何一个构造,或从可转换为其中任何一个Ts
的类型中转换。具有initializer_list
构造函数的类型可以从initializer_list
转换。将它们结合起来,就是您得到的结果。 - Nicol Bolas