#include <bitset>
#include <iostream>
using namespace std;
int main() {
bitset<8> c = 0;
c[3]=1;
auto s = c[5];
s = !s;
cout << c[5];
}
该程序将s视为一个类,其结果为c [5] = 1。看起来 汽车和放大器; s = c [5];
答案 0 :(得分:1)
这是一种方式。不漂亮,但这似乎有效:
auto s = !!c[5];
此外,你总是可以有一个明确的(int)
演员,但你必须有理由不这样做......
答案 1 :(得分:1)
auto
用于获取对象的实际类型。如果您想要其他类型(即不是代理参考),请不要使用auto
:
bool s = c[5];
答案 2 :(得分:0)
std::bitset::operator[]
返回rvalue,因此您无法引用它。您只能引用整个bitset。
答案 3 :(得分:0)
这是一个非常好的问题 - 尽管措辞可能更好。
如果我理解正确,您希望s
应构建为bool
并接收值false
,而是将其构建为bitset::reference
值0
,然后您可以否定,当然会更改原始bitset
并导致cout << c[5]
发出1
。
实际上是预期的结果。如果您阅读std::bitset::operator[]的文档,您将看到有两个重载:
bool operator[] (size_t pos) const;
reference operator[] (size_t pos);
以下评论:
如果bitset对象是const限定的,则该函数返回bool值。否则,它返回特殊成员类型引用的值,该值使用 reference-semantics 模拟一个bool值,相对于bitset中的一位(参见bitset::reference)。
所以基本上你想要第一个版本但是第二个版本。
为了实现您的目标,您必须执行以下任何操作:
声明显式类型bool
,而不是使用auto
,例如bool s = c[5];
使用显式强制转换为bool
,或将隐式转换为bool
的整数类型,例如auto s = static_cast<bool>(c[5]);
将bitset
声明为const
,例如const bitset<8> c = 16; auto s = c[5];
在访问该位之前将位集投射到const
,例如auto s = static_cast<const bitset<8>>(c)[5];
@ ly000是错误的,你不能引用bitset
中的某个位,因为这正是你在这里得到的(这就是引用语义的意思) - 虽然他的意思可能是你不能在传统意义上有一个引用,但需要bitset::reference
返回的operator[]
对象提供的包装器。
@Sam Varshavchik的解决方案之所以有效,是因为它强制bitset::reference
返回的operator[]
对象为bool
,以便不执行“{0}”。操作 - 但我个人并不喜欢这样,因为它有点模糊了你的意图。在我看来,最好的选择是选项一,或者如果你不需要更改位集,选项三。
顺便说一下,将bitset
初始化为0是多余的,因为默认构造函数会将所有位初始化为零。