c++ - 强制转换后无法访问 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;
}
解决方案
推荐阅读
- algorithm - 用给定的一组矩形填充正方形
- javascript - createContextualFragment() 是否应该能够处理 xml 声明?
- mysql - 如何找到下一个订单ID mysql
- c++ - 将 GLAD 包含到项目中,编译时得到“未解析的外部符号gladLoadGLLoader”
- gis - .img 和 .tif 格式之间是否存在影响 GDAL .SetNoDataValue() 工作方式的差异?
- ios - 如果手机上部署了第三方证书,iOS 11.3.1 无法连接到 Apple Store
- sql-server - 查找列表是否包含多个值 - SQL Server Xquery
- java - 如何使用spring data neo4j 4.1.2版保存地理空间点数据
- c# - 为什么整数比较会改变我的查询的连接类型?
- git - 从 git LFS 中提取所有文件