【问题标题】:C++ structured bindings not working with bitsetC++ 结构化绑定不适用于 bitset
【发布时间】:2019-08-13 15:05:34
【问题描述】:

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

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

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

简化代码 (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' 是 'std::bitset' 的不可访问的基础

9 |     auto [a] = f();

  |                  ^

编译器返回:1

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

【问题讨论】:

  • 我很好奇你想用这个实现什么/你希望会发生什么?您的函数返回多个值;它实际上只是返回一个位集。一个位集。

标签: c++ c++17


【解决方案1】:

有三种类型可用于结构化绑定:

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

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

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

【讨论】:

  • 我明白了。我需要通过返回 make_tuple(bitset()) 来指定它是一个元组。非常感谢!
  • 不,不要创建tuple&lt;bitset&gt;。这很奇怪。相反,请停止不恰当地使用结构化绑定。
  • @FallingStar 这没有任何意义。为什么?刚刚写了auto a = f();
【解决方案2】:

这……不是structured bindings 的用途。

你有一个位组。

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

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

【讨论】:

  • 我过于简单化了代码,实际上我需要返回一些数组,其中一个是位集。
  • 位集不是数组。
猜你喜欢
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
  • 2017-02-07
  • 1970-01-01
相关资源
最近更新 更多