我可以检查std :: optional函数参数是否在编译时包含值?

时间:2017-11-10 20:35:00

标签: c++ c++17

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)。但是我想插入一个快速的编译器检查。

我的编译器告诉我:

  

[静态断言有一个非常数条件

为什么这被认为是非常数?

2 个答案:

答案 0 :(得分:1)

首先,函数的参数,甚至是constexpr函数的参数,从不 constexpr。您只能通过模板参数传递constexpr值。

所以这与optional无关。

其次,即使允许函数采用constexpr个参数,virtual函数也肯定能够这样做。它们依赖于动态的运行时调度,因此无法在函数内进行编译时检查。

答案 1 :(得分:0)

有一个真的简单答案:i不是constexpr,因为i是一个函数参数(从不constexpr,除非在constexpr函数的编译时调用,但情况并非如此。