这是我的代码(改编自example on cppreference):
#include <iostream>
#include <variant>
class foo : public std::variant<int, float> {
public:
foo(int v) : std::variant<int,float>(v) {}
foo(float v) : std::variant<int,float>(v) {}
};
int main() {
foo v = 5;
std::visit([](auto &&arg) {
using T = std::decay_t<decltype(arg)>;
if constexpr (std::is_same_v<T, int>)
std::cout << "int: " << arg << std::endl;
else if constexpr (std::is_same_v<T, float>)
std::cout << "float: " << arg << std::endl;
}, v);
}
c(8.0.0)食用并正确输出
int: 5
但是,gcc(9.1.0)和Visual Studio 17都在编译时给出错误消息。所以我的问题是:根据规范,这是正确的代码吗?
使用v
替换调用中的static_cast<std::variant<int, float>>(v)
使所有三个编译器都能成功地编译代码,因此主要问题是std::visit
是否应接受从{{1 }}。