当从T **重新构造到vec <vec <t>&gt;时返回对临时错误的引用

时间:2016-01-09 13:25:18

标签: c++ matrix vector

我在operator []的代理类中遇到错误。它正在检查索引是否在范围内,并且当我使用T** values.

实现我的类模板时工作正常

但我觉得要将整个实施改为std::vector<std::vector<T>>。一切都很好,期待operator[]

Matrix类运算符

//***************************************************************************
template <typename T>
X_Proxy<T> Matrix<T>::operator [](const size_t& j)
{
    if(j >= y)
        ERROR_MSG(Y_OUT_RANGE);
    return X_Proxy<T>(inner[j], x);
}

//***************************************************************************
template <typename T>
const X_Proxy<T> Matrix<T>::operator [](const size_t& j) const
{
    if(j >= y)
        ERROR_MSG(Y_OUT_RANGE);
    return X_Proxy<T>(inner[j], x);
}
//***************************************************************************

代理类模板定义:

template <typename T>
struct X_Proxy
{
    X_Proxy(std::vector<T> PTR, const size_t X) : x_ptr(PTR), x(X) {}
    T& operator [] (size_t pos);
    const T& operator [] (size_t pos) const;
    std::vector<T>& x_ptr;
    const size_t& x;
};

代理类操作符:

//***************************************************************************
template <typename T>
T& X_Proxy<T>::operator [] (size_t pos)
{
    if (pos > x-1)
        Matrix<T>::ERROR_MSG(Matrix<T>::X_OUT_RANGE);
    return x_ptr[pos];
}
//***************************************************************************
template <typename T>
const T& X_Proxy<T>::operator [] (size_t pos) const
{
    if (pos > x-1)
        Matrix<T>::ERROR_MSG(Matrix<T>::X_OUT_RANGE);
    return x_ptr[pos];  // <--- the error line
}

//***************************************************************************

矩阵错误功能:

template <typename T>
void Matrix<T>::ERROR_MSG(const int& MSG)
{
    std::cerr << info[MSG] << std::endl;
    exit(MSG);
}

编译错误:

..\matrix.h:47: error: returning reference to temporary [-Wreturn-local-addr]
         return x_ptr[pos];
                         ^

我们可爱的模板库会出现什么问题?

1 个答案:

答案 0 :(得分:3)

您的X_Proxy构造函数正在存储对临时的引用:

X_Proxy(std::vector<T> PTR, const size_t X) : x_ptr(PTR), x(X) {}

此处,PTR是本地临时,x_ptr是左值参考:

std::vector<T>& x_ptr;

这不是标准的C ++,所以它甚至不应该编译。但是你的编译器允许它,给你一个悬空引用。

也许你想存储对有效矢量的引用:

X_Proxy(std::vector<T>& PTR, const size_t X) : x_ptr(PTR), x(X) {}
                      ^

只要PTR引用的向量比X_Proxy实例更长,就会有效。