cppreference.com指出类型bool
的{{3}}值。方法static_assert needs to be supplied a constexpr
。
这实际上是std::optional
作为函数参数。想象一下:
class T {
public:
virtual void f(std::optional<int> i) {...};
};
class U : public T {
public:
virtual void f(std::optional<int> i) override {
static_assert(i, "This is no longer optional");
f(i.value());
}
virtual void f(int i) {...}
};
基类中可选的参数转换为必需参数 我很清楚,这种形式的问题源于糟糕的面向对象设计,但我不能要求它现在重构它。我稍后会这样做(我保证:D)。但是我想插入一个快速的编译器检查。
我的编译器告诉我:
[静态断言有一个非常数条件
为什么这被认为是非常数?
答案 0 :(得分:1)
首先,函数的参数,甚至是constexpr
函数的参数,从不 constexpr
。您只能通过模板参数传递constexpr
值。
所以这与optional
无关。
其次,即使允许函数采用constexpr
个参数,virtual
函数也肯定不能够这样做。它们依赖于动态的运行时调度,因此无法在函数内进行编译时检查。
答案 1 :(得分:0)
有一个真的简单答案:i
不是constexpr
,因为i
是一个函数参数(从不constexpr
,除非在constexpr
函数的编译时调用,但情况并非如此。