在临时对象上调用成员函数时生成警告
Generating a warning when a member function is invoked on a temporary object
给定矩阵模板 class mat<M,N,T>
以下成员函数允许我有效地转置行向量或列向量,因为它们具有 same/corresponding 内存占用:
template<int M, int N=M, typename T = double>
struct mat {
// ...
template<int Md = M, int Nd = N, typename = std::enable_if_t<Md == 1 || Nd == 1>>
const mat<N, M, T>& transposedView() const {
static_assert(M == 1 || N == 1, "transposedView() supports only vectors, not general matrices.");
return *reinterpret_cast<const mat<N, M, T>*>(this);
}
}
我已经使用这个函数很多年了,出于习惯开始在临时表达式 (/*vector-valued expression*/).transposedView()
上调用它,忘记了它会 return 对临时的引用,并导致未定义GCC 咬我的行为。
有没有一种简单的方法可以让我添加一些东西,当我临时调用它时会产生某种警告?
或者只要我不存储引用,临时调用它实际上应该是安全的吗?
成员函数可以是qualified for lvalue or rvalue objects。使用它,您可以创建一个重载集,例如
template<int M, int N=M, typename T = double>
struct mat {
// ...
template<int Md = M, int Nd = N, typename = std::enable_if_t<Md == 1 || Nd == 1>>
const mat<N, M, T>& transposedView() & const {
static_assert(M == 1 || N == 1, "transposedView() supports only vectors, not general matrices.");
return *reinterpret_cast<const mat<N, M, T>*>(this);
}
template<int Md = M, int Nd = N, typename = std::enable_if_t<Md == 1 || Nd == 1>>
const mat<N, M, T>& transposedView() && const = delete;
}
现在,如果您尝试使用右值对象调用该函数,则会出现编译器错误。
给定矩阵模板 class mat<M,N,T>
以下成员函数允许我有效地转置行向量或列向量,因为它们具有 same/corresponding 内存占用:
template<int M, int N=M, typename T = double>
struct mat {
// ...
template<int Md = M, int Nd = N, typename = std::enable_if_t<Md == 1 || Nd == 1>>
const mat<N, M, T>& transposedView() const {
static_assert(M == 1 || N == 1, "transposedView() supports only vectors, not general matrices.");
return *reinterpret_cast<const mat<N, M, T>*>(this);
}
}
我已经使用这个函数很多年了,出于习惯开始在临时表达式 (/*vector-valued expression*/).transposedView()
上调用它,忘记了它会 return 对临时的引用,并导致未定义GCC 咬我的行为。
有没有一种简单的方法可以让我添加一些东西,当我临时调用它时会产生某种警告?
或者只要我不存储引用,临时调用它实际上应该是安全的吗?
成员函数可以是qualified for lvalue or rvalue objects。使用它,您可以创建一个重载集,例如
template<int M, int N=M, typename T = double>
struct mat {
// ...
template<int Md = M, int Nd = N, typename = std::enable_if_t<Md == 1 || Nd == 1>>
const mat<N, M, T>& transposedView() & const {
static_assert(M == 1 || N == 1, "transposedView() supports only vectors, not general matrices.");
return *reinterpret_cast<const mat<N, M, T>*>(this);
}
template<int Md = M, int Nd = N, typename = std::enable_if_t<Md == 1 || Nd == 1>>
const mat<N, M, T>& transposedView() && const = delete;
}
现在,如果您尝试使用右值对象调用该函数,则会出现编译器错误。