std::variant 重复类型导致没有合适的构造函数错误(clang-1300.0.29.3)

X.J*_*J.L 5 c++ c++17

只是想知道这是否是 的预期行为std::variant,以及这种行为的原因。

重现错误的简化代码如下:

double d= 1.0;
std::variant<std::monostate, double, double> v(d);
Run Code Online (Sandbox Code Playgroud)

错误信息如下:

no suitable constructor exists to convert from "double" to "std::__1::variant<std::__1::monostate, std::__1::remove_cv_t<std::__1::remove_reference_t<double &>>, std::__1::remove_cv_t<std::__1::remove_reference_t<double &>>>"C/C++(415)
Run Code Online (Sandbox Code Playgroud)

我现在找到的一个解决方案是创建一个元函数,从变体类型中删除重复项,然后使用 type 的变量进行构造double

IE

distinct<std::variant<std::monostate, double, double>>v(d);
//distinct_t<std::variant<std::monostate, double, double>> -> std::variant<std::monostate, double>
Run Code Online (Sandbox Code Playgroud)

如果有更好的解决方案,也请告诉我。

cig*_*ien 4

std::varianta 中允许有多个相同的类型。但是,当调用 的构造函数时std::variant,将执行重载解析以确定它需要保存哪些变体类型。如果您有 2 个相同的类型,则存在歧义,因此您会收到错误。

您可以明确指定要使用哪种类型

std::variant<std::monostate, double, double> v(std::in_place_index<1>, d); 
Run Code Online (Sandbox Code Playgroud)

这将使用第double一个std::variant.