首页 > 解决方案 > 强制转换后无法访问 constexpr CRTP 类的成员函数

问题描述

基于我得到的问题Constexpr Classtaking const references not compile的答案,我试图走得更远(玩弄表达式模板)。

因此,正如答案所建议的那样,我现在使用static变量作为输入,并且一切都正确编译(在 MSVC 2019 上)。

但是,添加后constexpr static auto val = expr[0]我得到 error C2131: expression did not evaluate to a constant。问题似乎与m_lhs[idx]那些m_rhs[idx]似乎并没有评估为常数一样,尽管事实上我已将所有标记operator[]constexpr.

有可能解决这个问题吗?

#include <cstddef>

template<class VecType>
struct Vector
{
    constexpr const VecType& get() const noexcept
    {
        return static_cast<const VecType&>(*this);
    }
};

template<size_t Size>
class FixedSizeVector : public Vector<FixedSizeVector<Size>>
{
public:
    constexpr explicit FixedSizeVector(const int(&array)[Size]) noexcept
        : m_vector()
    {
        for (size_t i = 0; i < Size; ++i)
            m_vector[i] = array[i];
    }

    constexpr const int& operator[](size_t idx) const noexcept {
        return m_vector[idx];
    }

private:
    int m_vector[Size];
};

template<class VecType1, class VecType2>
class ExpressionAdd : public Vector<ExpressionAdd<VecType1, VecType2>>
{
public:
    constexpr ExpressionAdd(const VecType1& lhs, const VecType2& rhs) noexcept
        : m_lhs(lhs), m_rhs(rhs) { }

    constexpr int operator[](size_t idx) const noexcept {
        return m_lhs[idx] + m_rhs[idx];
    }

private:
    const VecType1& m_lhs;
    const VecType2& m_rhs;
};

template<class VecType1, class VecType2>
constexpr auto operator+(const Vector<VecType1>& lhs, const Vector<VecType2>& rhs)
{
    return ExpressionAdd(lhs.get(), rhs.get());
}


int main()
{
    constexpr static int arr[]{ 4,2,9 };
    constexpr static FixedSizeVector a(arr);

    constexpr static auto expr = a + a;
    constexpr static auto val  = expr[0];  /* <--- this line causes an error */

    return 0;
}

标签: c++referencec++17constexpr

解决方案


推荐阅读