[英]Why doesn't the compiler warn “returning address of local variable or temporary” when returning a local reference to a local variable?
[英]Returning reference to temporary error when remodeling from T ** to vec<vec<T>>
我在operator []
代理类中遇到了一个错误。 它正在检查索引是否在范围内,并且当我用T** values.
实现我的类模板时工作正常T** values.
但是我感觉就像将整个实现更改为std::vector<std::vector<T>>
。 一切都很好,期望operator[]
。
矩阵类运算符
//***************************************************************************
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];
^
我们可爱的模板库可能会出什么问题?
您的X_Proxy
构造函数正在存储对临时文件的引用:
X_Proxy(std::vector<T> PTR, const size_t X) : x_ptr(PTR), x(X) {}
在这里, PTR
是本地临时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
实例, X_Proxy
将X_Proxy
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.