首页 文章

std :: visit for variant无法在clang 5下编译[重复]

提问于
浏览
11

这个问题在这里已有答案:

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

1 回答

  • 11

    这已知bug 33222似乎只影响libstdc的 std::variant (以及使用相同组合的其他结构) . 问题与模板的友元函数有关 - 请参阅线程以获取更多详细信息 .

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

    小更新:这已在最新的主干中修复 .

相关问题