首页 > 后端开发 > C++ > 为什么 `std::vector::reference` 不返回 `bool` 引用?

为什么 `std::vector::reference` 不返回 `bool` 引用?

DDD
发布: 2024-12-03 14:09:15
原创
553 人浏览过

Why Doesn't `std::vector::reference` Return a `bool` Reference?

为什么 'vector::reference' 不返回对 '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:29:28: error: no matching function for call to 'callIfToggled(const bool&, std::vector<bool>::reference, A&amp;)'
登录后复制

出现此问题是因为 'std::vector'是 'bool' 类型的专用模板。

'bool' 的向量专用化

在 'std::vector' 的情况下,' std::vector' 专门用于 'bool' 类型。这意味着底层数据存储和访问机制专门处理“bool”值的二进制性质。因此,“std::vector::reference”不会返回对“bool”对象的引用,而是返回对针对“bool”值优化的内部表示的引用。

'fixed_vector' 和 'Boost Containers'

要缓解此问题,您可以使用以下命令策略:

  1. 'fixed_vector' 模板元编程: 定义一个名为 'fixed_vector' 的自定义模板元程序,专门针对 'bool' 指定 'std::vector' 并使用 'char' 作为底层存储类型。这允许您检索对“char”值的引用,该值可以解释为“bool”值。
  2. “Boost Containers”库:使用“Boost Containers”库,它提供'std::vector' 的非专业化版本并支持对“bool”值的引用。

使用“fixed_vector”的示例:

template<typename t, typename... p>
using fixed_vector = std::vector<typename foo<t>::type, p...>;

int main()
{
    fixed_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);
}
登录后复制

使用“Boost Containers”的示例:

#include <boost/container/vector.hpp>

int main()
{
    boost::container::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);
}
登录后复制

以上是为什么 `std::vector::reference` 不返回 `bool` 引用?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板