使用非常量值初始化的引用到连续 class 成员
reference-to-cont class member initialized with non-const value
我有一个 class 作为输入数据,它应该使用对外部数据的引用(不复制),或者根据其他输入创建数据本身。我更喜欢使用引用(以避免取消引用,因为数据是矩阵)并以以下结构(简化)结束:
#include <iostream>
#include <vector>
using namespace std;
using VectI = vector<int>;
class A {
VectI x0;
VectI const & x = x0;
public:
A(VectI const & extX) : x(extX) {} // referencing existing external data
A(int i) { x0.push_back(i); x0.push_back(i*i); } // create from other data
void show_x()
{ cout << "x ="; for (auto&& i : x) cout << " " << i; cout << endl; }
};
int main() {
VectI myX = {1, 2, 3};
A a(myX); a.show_x(); // a references myX
A b(2); b.show_x(); // b creates its own data based on i=2
return 0;
}
示例有效:
x = 1 2 3
x = 2 4
但是这种方法有什么潜在的问题吗?
特别是,我正在更改 const 向量 x
'legal' C++ 引用的 x0
的事实,还是其他编译器可能会抱怨?
此外,我可以确定第一个构造函数避免复制数据吗?
这在 C++11 标准中很好,但您的代码非常脆弱。
特别是编译器生成的复制和移动构造函数以及赋值运算符将无法正常工作,因此您必须构建自己的。
您可能还会遇到悬挂引用:请记住,由于 const 引用而导致的对象生命周期延长是不可传递的。将 A(VectI const & extX)
与匿名临时对象一起使用的行为未定义。
使用指向 VectI
的指针 - 也许甚至 std::unique_ptr
指向 VectI
以及所有权的概念可能是更安全的方法。
我有一个 class 作为输入数据,它应该使用对外部数据的引用(不复制),或者根据其他输入创建数据本身。我更喜欢使用引用(以避免取消引用,因为数据是矩阵)并以以下结构(简化)结束:
#include <iostream>
#include <vector>
using namespace std;
using VectI = vector<int>;
class A {
VectI x0;
VectI const & x = x0;
public:
A(VectI const & extX) : x(extX) {} // referencing existing external data
A(int i) { x0.push_back(i); x0.push_back(i*i); } // create from other data
void show_x()
{ cout << "x ="; for (auto&& i : x) cout << " " << i; cout << endl; }
};
int main() {
VectI myX = {1, 2, 3};
A a(myX); a.show_x(); // a references myX
A b(2); b.show_x(); // b creates its own data based on i=2
return 0;
}
示例有效:
x = 1 2 3
x = 2 4
但是这种方法有什么潜在的问题吗?
特别是,我正在更改 const 向量 x
'legal' C++ 引用的 x0
的事实,还是其他编译器可能会抱怨?
此外,我可以确定第一个构造函数避免复制数据吗?
这在 C++11 标准中很好,但您的代码非常脆弱。
特别是编译器生成的复制和移动构造函数以及赋值运算符将无法正常工作,因此您必须构建自己的。
您可能还会遇到悬挂引用:请记住,由于 const 引用而导致的对象生命周期延长是不可传递的。将 A(VectI const & extX)
与匿名临时对象一起使用的行为未定义。
使用指向 VectI
的指针 - 也许甚至 std::unique_ptr
指向 VectI
以及所有权的概念可能是更安全的方法。