std::variant 重复类型导致没有合适的构造函数错误(clang-1300.0.29.3)
std::variant duplicate type cause no suitable constructor error(clang-1300.0.29.3)
只是想知道这是否是 std::variant
的预期行为,以及这种行为的原因。
重现错误的简化代码如下:
double d= 1.0;
std::variant<std::monostate, double, double> v(d);
报错信息如下:
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)
我现在找到的一个解决方案是创建一个元函数,从变体类型中删除重复项,然后使用 double
.
类型的变量进行构造
即
distinct<std::variant<std::monostate, double, double>>v(d);
//distinct_t<std::variant<std::monostate, double, double>> -> std::variant<std::monostate, double>
如果有更好的解决办法,也请告诉我。
允许在 std::variant
中有多个相同的类型。但是,当 std::variant
的构造函数被调用时,会执行重载决策以确定它需要持有哪些变体类型。如果您有 2 个相同的类型,就会出现歧义,因此会出现错误。
您可以明确指定要使用的类型
std::variant<std::monostate, double, double> v(std::in_place_index<1>, d);
这将使用 std::variant
的第一个 double
。
只是想知道这是否是 std::variant
的预期行为,以及这种行为的原因。
重现错误的简化代码如下:
double d= 1.0;
std::variant<std::monostate, double, double> v(d);
报错信息如下:
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)
我现在找到的一个解决方案是创建一个元函数,从变体类型中删除重复项,然后使用 double
.
即
distinct<std::variant<std::monostate, double, double>>v(d);
//distinct_t<std::variant<std::monostate, double, double>> -> std::variant<std::monostate, double>
如果有更好的解决办法,也请告诉我。
允许在 std::variant
中有多个相同的类型。但是,当 std::variant
的构造函数被调用时,会执行重载决策以确定它需要持有哪些变体类型。如果您有 2 个相同的类型,就会出现歧义,因此会出现错误。
您可以明确指定要使用的类型
std::variant<std::monostate, double, double> v(std::in_place_index<1>, d);
这将使用 std::variant
的第一个 double
。