我在C++17中有以下代码,我在其中定义了struct
一个位掩码,并且具有类型为位字段的成员变量bool
。
我正在定义一个tie
函数,以便我可以将它转换为一个可比较的std::tuple
对象,这很方便。问题是:std::tie
似乎做错了什么,并且第一个成员变量的值似乎是false
即使默认构造函数已正确将其初始化为true
.
手动对位字段进行单个引用bool
似乎可以按预期工作。
我目前正在使用 CLang 12。
这是代码:
#include <cassert>
#include <tuple>
struct Bitmask
{
Bitmask( )
: first{true}
, second{false}
, third{false}
{
}
bool first : 1;
bool second : 1;
bool third : 1;
};
auto
tie( const Bitmask& self )
{
return std::tie( self.first, self.second, self.third );
}
int main()
{
Bitmask default_bitmask;
Bitmask custom_bitmask;
custom_bitmask.first = false;
custom_bitmask.second = true;
const bool& ref_1 = default_bitmask.first;
const bool& ref_2 = custom_bitmask.first;
assert( ref_1 != ref_2 ); // this check works
assert( std::get< 0 >( tie( default_bitmask ) ) == true ); // this check fails
assert( std::get< 0 >( tie( custom_bitmask ) ) == false ); // this check works
}