首页 > 解决方案 > 如何在 C++ 初始化程序列表中将 const 引用成员初始化为另一个成员(标准向量)

问题描述

_numbers我做了以下作为一种廉价的方法来允许通过以下方式对成员容器进行只读访问numbers

class Foo {
    Foo() : _numbers({}), numbers(_numbers) {
    // some code that populates `numbers` via `numbers.push_back(...)`
}

private:
    std::vector<int> _numbers;
public:
    const std::vector<int>& numbers;
}

但是,这样做我发现它numbers是空的,而在其他情况下它将包含与_numbers.

更准确地说,它似乎是未定义的行为。在我的真实示例(这是一个简化版本)中,我有多个使用此方案的引用容器对,其中填充的数据在某些对的 const-reference 成员中可见,而对于某些则不是。

知道这有什么问题吗?任何帮助都深表感谢。

编辑这是一个最小的工作示例:

#include <vector>

struct Foo2 {
public:
     const int max1;
     const int center1;

    Foo2(const int max1_);
private:
    std::vector<int> _numbers1, _numbers2;

public:
    const std::vector<int>& numbers1, numbers2;
};

Foo2::Foo2(const int max1_)
    : max1(max1_), center1(max1_/2),
      _numbers1({}), _numbers2({}),
      numbers1(_numbers1),
      numbers2(_numbers2)
{
    cout << max1 << endl;

    for (int i=0; i<center1; i++) {
        _numbers1.push_back(i);
        cout << "A: " << i << endl;
    }
    for (int i=center1; i<max1; i++) {
        _numbers2.push_back(i);
        cout << "B: " << i << endl;
    }

    for (int i: numbers1) {
        cout << "A: " << i << endl;
    }
    for (int i: numbers2) {
        cout << "B: " << i << endl;
    }
}

初始化时给出以下输出Foo2 f(8)

8
A: 0
A: 1
A: 2
A: 3
B: 4
B: 5
B: 6
B: 7
A: 0
A: 1
A: 2
A: 3

numbers2看不到_numbers2while 的内容,因为numbers1它似乎有效。

标签: c++initializationinitializer-listconst-reference

解决方案


const vector<int>& numbers1, numbers2;— 这里,只有第一个变量是引用。您还需要&在第二个变量之前使其成为参考。然后代码应该可以工作。

但我不得不说,你正在做的是一个非常糟糕的主意。您正在为具有内存开销、不可分配性和可能的​​速度开销的便捷语法付费。

改用吸气剂:const vector<int>& numbers1() const {return _numbers1;}. 是的,您()每次都必须输入额外的内容。


推荐阅读