为什么 auto 为 std::bitset::operator [] 推导一个引用对象而不是 bool
Why auto deduces a reference object instead of bool for std::bitset::operator []
我有以下代码
std::bitset<32> bs{21};
auto ref_obj = bs[0];
auto &another_ref = bs[0];
bool bool_obj = bs[0];
ref_obj
的类型不是 bool
。但是 another_ref
与 ref_obj
具有相同的类型。 std::bitset::operator[]
在 http://en.cppreference.com/w/cpp/utility/bitset/operator_at
中列出了 3 个重载
但我想不通为什么会这样。
根据 C++11 标准,如果您的位集不是 const
(而您的也不是),则返回一个引用类型:
§20.6.2 位集操作:
constexpr bool operator[](size_t pos) const; // for b[i];
reference operator[](size_t pos); // for b[i];
C++ 中的最小可寻址类型是一个字节,大概是至少8 位 [intro.memory/1]。因此,无法 return 引用单个 位 (小于 1 个字节)。因此,当您需要对此进行引用时,returned.
执行一些黑魔法的代理
您的对象不是 const
,因此假设您可能希望通过 []
运算符修改元素。您可以将其转换为 const
引用并访问 const
限定成员重载。
我有以下代码
std::bitset<32> bs{21};
auto ref_obj = bs[0];
auto &another_ref = bs[0];
bool bool_obj = bs[0];
ref_obj
的类型不是 bool
。但是 another_ref
与 ref_obj
具有相同的类型。 std::bitset::operator[]
在 http://en.cppreference.com/w/cpp/utility/bitset/operator_at
但我想不通为什么会这样。
根据 C++11 标准,如果您的位集不是 const
(而您的也不是),则返回一个引用类型:
§20.6.2 位集操作:
constexpr bool operator[](size_t pos) const; // for b[i];
reference operator[](size_t pos); // for b[i];
C++ 中的最小可寻址类型是一个字节,大概是至少8 位 [intro.memory/1]。因此,无法 return 引用单个 位 (小于 1 个字节)。因此,当您需要对此进行引用时,returned.
执行一些黑魔法的代理您的对象不是 const
,因此假设您可能希望通过 []
运算符修改元素。您可以将其转换为 const
引用并访问 const
限定成员重载。