Vit*_*meo 19 c++ variant language-lawyer c++17
请考虑以下代码段:
struct v : std::variant<int, std::vector<v>> { };
int main()
{
std::visit([](auto){ }, v{0});
}
Run Code Online (Sandbox Code Playgroud)
clang ++ 7用-stdlib=libc++ -std=c++2a编译代码;
g ++ 9 -std=c++2a无法编译代码,出现以下错误:
/opt/compiler-explorer/gcc-trunk-20180711/include/c++/9.0.0/variant:94:29:错误:嵌套名称说明符中使用的不完整类型'std :: variant_size'
Run Code Online (Sandbox Code Playgroud)inline constexpr size_t variant_size_v = variant_size<_Variant>::value; ^~~~~~~~~~~~~~
两种实现都符合标准吗?
如果没有,这里的实施是正确的,为什么?
看起来它是gcc实现中的一个错误.根据cppreference,它被称为呼吁invokea std::get.std::get<>是为可转换为的任何东西定义的std::variant(因为它std::variant通过转发引用接受参数).您的结构可以转换为std::variant,因此std::get它本身适用于您在gcc中的结构.
gcc实现选择使用a std::variant_size作为其实现的一部分visit的事实是它们的实现细节,并且它不(并且不应该)适用于您的struct的事实是无关紧要的.
结论:由于实施中的疏忽,这是gcc中的一个错误.