std :: visit的以下用法在gcc 7.2下正确编译,但无法在clang 5.0下编译。有谁知道问题是什么?
#include <variant>
struct S1 {int foo() { return 0; }};
struct S2 {int foo() { return 1; }};
using V = std::variant<S1, S2>;
int bar() {
V v;
return std::visit([](auto& s) { return s.foo(); }, v);
}
第一个错误是:
include/c++/7.2.0/variant:238:46: error: cannot cast 'std::variant<S1, S2>' to its private base class
'std::__detail::__variant::_Variant_storage<true, S1, S2>'
return __get(std::in_place_index<_Np>, std::forward<_Variant>(__v)._M_u);
以下是godbolt的链接显示此错误:https://godbolt.org/g/5iaKUm
答案 0 :(得分:11)
这是已知的bug 33222,它似乎只影响libstdc ++的std::variant
(以及使用相同组合的其他构造)。该问题与模板的友元函数有关 - 请参阅该主题以获取更多详细信息。
libc ++的变体似乎没有使用libstdc ++使用的朋友技术,因此您可能希望在此期间暂时更改为libc ++。
小更新:这已在最新的主干中修复。