在临时对象上调用成员函数时生成警告

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;
}

现在,如果您尝试使用右值对象调用该函数,则会出现编译器错误。