虚函数可以是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
函数进行操作。
Can virtual functions be constexpr?
是的。 仅自 C++20 起,虚函数可以 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
函数进行操作。
Can virtual functions be constexpr?
是的。 仅自 C++20 起,虚函数可以 constexpr
.