c++ - 积分模板参数。错误:在常量表达式中使用“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()可以在编译时评估,但可能是另一个问题,所以我会检查第一个答案。
解决方案
std::array::size
,即使是constexpr
函数,也不是static
函数。这意味着它需要调用一个对象实例。
在这种特殊情况下,at
不是constexpr
†</sup>,因此this
也不是并且反过来_a
。由于_a
is not constexpr
,_a.size()
is not constexpr
too 的结果。
† 即使是,身体仍然不被考虑constexpr
。
推荐阅读
- python - 无法在 Python 中打印完整的混淆矩阵
- go - Golang 同步 Goroutines
- r - 使用来自另一个数据帧的值删除 R 中的变量
- node.js - 在 POST 请求中使用 url 参数
- ios - 检查文件夹何时存在或不存在的可选语句
- php - while 循环中的 Sql Query 使我的应用程序非常慢
- debugging - SFML 库入口点
- java - 尝试根据先前的决定猜测您的下一个选择(正面或反面)的 Java 程序出现 ArrayIndexOutOfBounds 错误
- android - 如何在专辑标签中播放歌曲?
- swift - 执行滚动视图驱动的交互式过渡