我有以下辅助功能:
template<typename T, std::size_t N>
constexpr std::size_t Length(const T(&)[N]) {
return N;
}
它返回静态数组的长度。在过去,这总是有效的,但是当我这样做时:
struct Foo
{
unsigned int temp1[3];
void Bar()
{
constexpr std::size_t t = Length(temp1); // Error here
}
};
使用 MSVS 2017 时出现错误:
error C2131: expression did not evaluate to a constant
note: failure was caused by a read of a variable outside its lifetime
note: see usage of 'this'
我希望有人能够阐明我做错了什么。
MSVC 是正确的。Length(temp1)
不是常量表达式。从[expr.const]p2 http://eel.is/c++draft/expr.const#2.1
一种表达e是一个核心常量表达式,除非评估e遵循抽象机的规则,将计算以下表达式之一:
-
this
,除了在 constexpr 函数或作为 constexpr 一部分进行计算的 constexpr 构造函数中e;
temp1
评估this
隐含地(因为你指的是this->temp1
),所以你没有常量表达式。 gcc 和 clang 接受它,因为它们支持 VLA 作为扩展(尝试使用-Werror=vla
or -pedantic-errors
).
为什么不允许这样做?好吧,您可以访问底层元素并可能修改它们。如果你正在处理一个constexpr
数组或作为常量表达式求值的数组,但如果不是,则不可能有常量表达式,因为您将操作在运行时设置的值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)