C ++结构化绑定不适用于位集

时间:2019-08-13 15:05:34

标签: c++ c++17

我正在编写一个需要返回多个变量的函数,其中一个是位集。然后我遇到了一些奇怪的编译错误。

我尝试了不同的编译器,尽管它们带有不同的消息,但它们都会产生错误。

我尝试使用谷歌搜索,这似乎与公共和私有继承有关。但是我认为它不会以任何方式影响这段代码。

简化代码(C ++ 17)如下:

#include <bitset>
auto f() { return bitset<100>(); }

int main()
{
    auto [a] = f();
    return 0;
}

如果我删除方括号(即删除结构化装订并使用正常自动),则它会起作用。

错误信息如下:

source.cpp:在函数'int main()'中:

source.cpp:9:18:错误:'std :: _ Base_bitset <2>'是'std :: bitset <100>'不可访问的基

9 |     auto [a] = f();

  |                  ^

编译器返回:1

所以我的问题是:这是预期的行为还是我做错了什么?欢迎提出建议。

2 个答案:

答案 0 :(得分:8)

可以使用三种类型的结构化绑定:

  • 语言数组
  • 选择加入元组协议的
  • 类型(即它们提供tuple_sizetuple_element的专业化以及get的重载)
  • 所有成员都是相同基类(〜ish)的公共成员的
  • 类型

std::bitset都不是这些。它的规范没有说明其成员是什么,也没有提供元组协议的选择加入。因此,它不适用于结构化绑定。预计auto [a] = f();会失败。

如果有的话,为什么bitset<100>只提供一个绑定?我希望如果它提供绑定,它将提供100个绑定...

答案 1 :(得分:6)

这不是…structured bindings的目的。

您有一个 位。

您的方法可能会触发可以绑定到数据成员的SB规则;但是,正如您所发现的,这并不是有用或不受支持的,并且每个实现(其代码略有不同)都会产生不同的症状。

以通常的方式简单地使用此单个返回值。

相关问题