虚函数可以是constexpr吗?

Can virtual functions be constexpr?

下面代码中X::f()这样的虚函数可以吗

struct X 
{
    constexpr virtual int f() const 
    {
        return 0;
    }
};

constexpr?

自 C++20 起,此答案不再正确。

没有。来自 [dcl.constexpr]/3(7.1.5,“constexpr 说明符”):

The definition of a constexpr function shall satisfy the following requirements:

— it shall not be virtual

从 C++17 开始,virtual 函数无法声明 constexpr。一般原因是,在 constexpr 代码中,一切都可以在编译时发生。因此,拥有一个引用基 class 并在其上调用 virtual 函数的函数确实没有多大意义;您不妨将其设为 template 函数并传递真实类型,因为您 知道 真实类型。

当然,随着 constexpr 代码变得更加复杂,或者如果您想在编译时代码和运行时代码之间共享接口,这种想法并不奏效。在这两种情况下,很容易忘记原始类型。它还可以让 std::error_code 变得更加 constexpr 友好。

此外,C++20 将允许我们进行(有限的)对象动态分配,这意味着很容易忘记原始类型。您现在可以在 constexpr 代码中创建一个 vector<Base*>,将一些 Derived class 实例插入其中,然后将其传递给 constexpr 函数进行操作。

所以 C++20 allows virtual functions to be declared constexpr.

Can virtual functions be constexpr?

是的。 仅自 C++20 起,虚函数可以 constexpr.