1

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

#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

但是这种方法有什么潜在的问题吗?特别是,我正在更改的事实x0是由const向量x “合法”C++ 引用的,还是其他编译器可能会抱怨的事情?

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

4

1 回答 1

1

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

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

您可能还会遇到悬空引用:请记住,由于 const 引用而导致的对象生命周期延长是不可传递的。A(VectI const & extX)使用匿名临时的行为是未定义的。

使用指向VectI- 甚至可能是指向std::unique_ptraVectI以及所有权概念的指针可能是一种更安全的方法。

于 2016-01-12T13:26:29.843 回答