错误:表达式必须具有常数值.对于一个明显的常数值

Error: expression must have constant value. For a Clearly Constant Value

本文关键字:常数值 于一个 表达式 错误      更新时间:2023-10-16

我有一个非常简单的项目,它在VS2015中产生奇怪的行为:

#include "Vec2f.h"
#include "StaticRendercomponent.h"
int main(int argc, char** argv)
{
   constexpr Vec2f position(0.0f, 0.0f);
   constexpr PhysicsComponent component(position, 15.0f);
   return 0;
}

VS2015以红色突出显示构造函数中的position参数。将鼠标悬停在高亮显示上时,会出现以下消息:

constexpr Vec2f position = {(0.0f), (0.0f)}
expression must have constant value

与错误高亮显示和消息相反,程序编译和运行没有任何障碍,构建日志中没有任何消息,警告级别为4和"将警告视为错误";活跃。

有VS显示这样的错误,并继续编译我的程序,甚至没有在构建日志中显示消息是…至少可以说令人不安。

为什么显示这个消息?
为什么不停止应用程序的编译和运行?

<标题>嫌疑人h1> Vec2f的构造函数:
constexpr Vec2f::Vec2f(const float x, const float y) noexcept:
   x(x),
   y(y)
{
}

PhysicsComponent构造函数:

constexpr PhysicsComponent::PhysicsComponent(Vec2f position, float mass, Vec2f momentum) noexcept:
   current(position, mass, momentum),
   previous(current),
   interpolated(current)
{
}

三个数据成员"current"、"previous"、"&"answers"&;interpolated&;"类型为PhysicsState,其构造函数详细说明如下

constexpr PhysicsState::PhysicsState(Vec2f position, float mass, Vec2f momentum) noexcept:
   mass(mass),
   inverseMass(MathUtils::computeInverse(mass)),
   position(position),
   momentum(momentum),
   externalForce(ZERO_VECTOR)
{
}

computeInverse的签名如下:

template<typename T>
constexpr T computeInverse(T value) noexcept

我仍然想知道如果物理状态没有成功地被constexpr初始化由编译器由于调用computerInverse(),但添加行:

constexpr PhysicsState test(position, 15.0f);

To main()编译并运行时没有消息,也没有高亮显示。

如果编译,忽略智能感知。它有时只是发出错误的警告。