使用非const值初始化的reference-to-cont类成员

时间:2016-01-12 13:17:07

标签: c++ c++11 const-reference

我有一个类,它应该作为输入数据使用对外部数据的引用(不复制),或者根据其他输入创建数据本身。我更喜欢使用引用(以避免解引用,因为数据是矩阵)并最终得到以下结构(简化):

#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 向量x0'合法'C ++引用的x,还是其他编译器可能会抱怨的东西?

另外,我可以确定第一个构造函数避免复制数据吗?

1 个答案:

答案 0 :(得分:1)

这在C ++ 11标准中很好,但你的代码非常脆弱。

特别是编译器生成的复制和移动构造函数以及赋值运算符将无法正常工作,因此您必须构建自己的构造函数。

您可能还会遇到悬空引用:请记住,由于const引用导致的对象生存期扩展不可传递。 <{1}}与匿名临时使用的行为未定义。

使用指向A(VectI const & extX)的指针 - 甚至是VectIstd::unique_ptr以及所有权概念可能是一种更安全的方式。