flo*_*onk 0 c++ initialization initializer-list const-reference
_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;
}
Run Code Online (Sandbox Code Playgroud)
然而,这样做我发现它numbers是空的,而在其他情况下它将包含与 相同的元素_numbers。
更准确地说,这似乎是未定义的行为。在我的真实示例(这是一个简化版本)中,我有多个采用此方案的引用容器对,其中填充的数据在某些对的常量引用成员中可见,而对于某些对则不可见。
知道这有什么问题吗?非常感谢任何帮助。
编辑这是一个最小的工作示例:
#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;
}
}
Run Code Online (Sandbox Code Playgroud)
初始化时给出以下输出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
Run Code Online (Sandbox Code Playgroud)
ienumbers2看不到 while 的内容_numbers2,因为numbers1它似乎有效。
const vector<int>& numbers1, numbers2;\xe2\x80\x94 这里,只有第一个变量是引用。您&还需要在第二个变量之前将其设为引用。然后代码应该可以工作。
但我不得不说,你正在做的事情是一个非常糟糕的主意。您正在为一种方便的语法付出代价,其中包括内存开销、不可分配性以及可能的速度开销。
\n使用吸气剂代替:const vector<int>& numbers1() const {return _numbers1;}. ()是的,您每次都必须输入额外的内容。