首页 > 解决方案 > 积分模板参数。错误:在常量表达式中使用“this”

问题描述

我试图在 SO 中找到类似的已回答问题,但没有成功。问题是为什么在编译时使用已知的编译时类型的模板参数值在编译时使用被认为是错误的?常识告诉我,这段代码是可以的。在这种情况下有什么问题?谢谢!

#include <array>

using Cont = std::array<int, 2>;

class A
{
    Cont a_ = {};

public:
    int& at(bool first)
    {
        static_assert(sizeof(a_) / sizeof(int) == 2); // OK
        static_assert(a_.size() > 1); // error: non-constant condition for static assertion. error: use of 'this' in a constant expression
        return a_[first ? 0 : 1];
    }
};

在编译器资源管理器

更新:它看起来像重复但可能不是因为在链接下的问题中,演讲是关于运行时评估的,但这里看起来 a_.size() 可以在编译时评估。

UPDATE2更清晰的例子(在考虑答案和评论后)

#include <array>

using Cont = std::array<int, 2>;

// OK
void checkSize(const Cont& b)
{
    static_assert(b.size() == 2);
}

class A
{
    Cont a_ = {};

public:
    constexpr void checkSize() const
    {
        Cont b = {};
        static_assert(b.size() == 2); // OK
        static_assert(sizeof(a_) / sizeof(int) == 2); // OK
        static_assert(a_.size() == 2); // error: non-constant condition for static assertion. error: use of 'this' in a constant expression
    }
};

表明其中的问题涉及评估a_.size()。但是为什么需要它,虽然a_被编译器称为非虚拟类型并且size()可以在编译时评估,但可能是另一个问题,所以我会检查第一个答案。

标签: c++

解决方案


std::array::size,即使是constexpr函数,也不是static函数。这意味着它需要调用一个对象实例。

在这种特殊情况下,at不是constexpr†</sup>,因此this也不是并且反过来_a。由于_ais not constexpr_a.size()is not constexprtoo 的结果。

† 即使是,身体仍然不被考虑constexpr


推荐阅读