为什么 vector:<bool>:reference 不返回对 bool 的引用?
Why vector<bool>::reference doesn't return reference to bool?
#include <vector>
struct A
{
void foo(){}
};
template< typename T >
void callIfToggled( bool v1, bool &v2, T & t )
{
if ( v1 != v2 )
{
v2 = v1;
t.foo();
}
}
int main()
{
std::vector< bool > v= { false, true, false };
const bool f = false;
A a;
callIfToggled( f, v[0], a );
callIfToggled( f, v[1], a );
callIfToggled( f, v[2], a );
}
上面示例的编译会产生下一个错误:
dk2.cpp: In function 'int main()':
dk2.cpp:29:28: error: no matching function for call to 'callIfToggled(const bool&, std::vector<bool>::reference, A&)'
dk2.cpp:29:28: note: candidate is:
dk2.cpp:13:6: note: template<class T> void callIfToggled(bool, bool&, T&)
我使用 g++(版本 4.6.1(编译,如下所示:
g++ -O3 -std=c++0x -Wall -Wextra -pedantic dk2.cpp
问题是为什么会这样?vector<bool>::reference
不是bool&
吗?还是编译器的错误?
或者,我在尝试一些愚蠢的事情吗?:)
Vector 专门用于布尔值。
它被认为是标准错误。 请改用vector<char>
:
template<typename t>
struct foo {
using type = t;
};
template<>
struct foo<bool> {
using type = char;
};
template<typename t, typename... p>
using fixed_vector = std::vector<typename foo<t>::type, p...>;
有时,您可能需要引用向量中包含的布尔值。不幸的是,使用 vector<char>
只能为您提供对字符的引用。如果您确实需要bool&
,请查看 Boost 容器库。它有一个非专业版本的vector<bool>
。
你的期望是正常的,但问题是std::vector<bool>
一直是C++委员会的一种实验。它实际上是一种模板专用化,将布尔值紧密打包在内存中:每个值一位。
既然你不能引用一点,那就有你的问题了。
std::vector< bool >
打包其内容,因此每个布尔值都存储在一位中,八位到一个字节。这是内存效率高但计算密集型的,因为处理器必须执行算术才能访问请求的位。它不适用于bool
引用或指针语义,因为字节中的位在C++对象模型中没有地址。
您仍然可以声明 std::vector<bool>::reference
类型的变量,并像bool&
一样使用它。这允许通用算法兼容。
std::vector< bool > bitvec( 22 );
std::vector< bool >::reference third = bitvec[ 2 ];
third = true; // assign value to referenced bit
在 C++11 中,您可以使用 auto
和 &&
说明符来解决此问题,该说明符会自动选择绑定到向量元素的左值引用或绑定到临时元素的右值引用。
std::vector< bool > bitvec( 22 );
auto &&third = bitvec[ 2 ]; // obtain a std::vector< bool >::reference
third = true; // assign value to referenced bit
std::vector<bool>
是一个不符合标准的容器。为了优化空间,它包含bool
,无法提供参考。
请改用boost::dynamic_bitset
。
只是我的 2 美分:
std::vector<bool>::reference
是 struct _Bit_reference
的类型定义,定义为
typedef unsigned long _Bit_type;
struct _Bit_reference
{
_Bit_type * _M_p;
_Bit_type _M_mask;
// constructors, operators, etc...
operator bool() const
{ return !!(*_M_p & _M_mask); }
};
像这样更改函数,它可以工作(好吧,至少编译,尚未测试(:
template< typename T >
void callIfToggled( bool v1, std::vector<bool>::reference v2, T & t )
{
bool b = v2;
if ( v1 != b )
{
v2 = v1;
t.foo();
}
}
编辑:我将条件从(v1 != v2(更改为(v1 != b(。
创建一个包含bool
的结构,并使用该结构类型进行vector<>
。
尝试:
vector<struct sb>
sb
在哪里struct {boolean b];
那你可以说
push_back({true})
做
typedef struct sbool {bool b;} boolstruct;
然后vector<boolstruct> bs;
- 将对象数组的引用传递给函数
- 写入向量<向量<bool>>
- 如何告诉自动推断向量<bool>元素的非引用类型
- 错误:(49) 在 Android 中使用 OpenCV 原生时未定义对'cv::Stitcher::createDefault(bool)'的引用
- 对 'cv::Stitcher::createDefault(bool)' 的未定义引用
- 通过引用传递基元类型(如 int、bool)是否比按值传递有任何加速?还是会恶化时间/空间的使用
- 升压::可选<bool>取消引用
- 引用 std::atomic <bool>的已删除函数错误
- C 通过引用传递const bool
- VC++ 自动说明符假定矢量的引用限定符<bool>::back的引用限定符
- 通过引用传递bool并使用其最新值
- 使用类型"bool"类型的值初始化类型"int &"(非常量限定)的引用是否是一种黑客?
- 从 std::vector <bool>获取布尔值引用
- 为什么 vector:<bool>:reference 不返回对 bool 的引用?
- c++捕获到bool值错误的引用
- 为什么包含未使用的bool类型会影响char类型的引用?
- 与MSVC 2015比较bool和int引用时发出警告
- 无法解决错误:对类型"bool"的非常量左值引用无法绑定到类型"bool"的临时
- 错误:从类型为"std::vector:<bool>:reference {aka std::_Bit_reference}"的右值初始化类型为"bool&"的非常量引用无效
- 向量如何处理<bool>引用和迭代器?