Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以在编译时检查std::optional函数参数是否包含值吗?_C++_C++17 - Fatal编程技术网

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

C++ 我可以在编译时检查std::optional函数参数是否包含值吗?,c++,c++17,C++,C++17,cppreference.com声明类型为bool的值。这就是方法 这实际上是关于函数参数的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(

cppreference.com声明类型为
bool
的值。这就是方法

这实际上是关于函数参数的
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) {...}
};
T类{
公众:
虚空f(std::可选i){…};
};
U类:公共交通{
公众:
虚空f(标准::可选i)覆盖{
静态断言(i,“这不再是可选的”);
f(i.值());
}
虚空f(int i){…}
};
基类中可选的参数已转换为必需的参数。
我很清楚,这种形式的问题源于糟糕的OO设计,但我现在不能被要求重构它。我以后会做的(我保证:D)。但是我想插入一个快速的编译器检查

我的编译器告诉我:

静态断言有一个非常量条件


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

首先,函数的参数,甚至是
constepr
函数的参数,从来都不是
constepr
。只能通过模板参数传递
constepr

因此,这与
可选
无关


其次,即使允许函数使用
constepr
参数,
virtual
函数也肯定不能这样做。它们依赖于动态的运行时调度,因此不可能在函数中进行编译时检查。

有一个非常简单的答案:
i
不是
constepr
,因为
i
是函数参数(这永远不是
constexpr
,除非在
constexpr
函数的编译时调用中,情况并非如此。

提供一些更容易讨论的示例。“我假设不是。”如果你已经清楚地解释了它们为什么会起作用,那么你就没有必要去假设它们。当检查它们是否起作用是件小事时。我编辑了这个问题。我遗漏了重要的部分……很抱歉。@MartinB:现在这是一个完全不同的问题!