c-std :: visit for variant无法在clang 5下编译

这个问题已经在这里有了答案:            >            get<string> for variants fail under clang++ but not g++                                    1个
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

解决方法:

已知bug 33222似乎仅影响libstdc的std :: variant(以及使用相同组合的其他构造).问题与模板的好友功能有关-有关更多详细信息,请参见线程.

libc的变体似乎没有使用libstdc所使用的朋友技术,因此您可能希望在此期间暂时更改为libc.

小更新:此问题已在最新的中继中修复.

上一篇:c-GMOCKing接口时std :: any的类型不完整


下一篇:c – 使用std :: launder从指向非活动对象的指针获取指向活动对象成员的指针?