以下代码中的虚拟函数如X::f()
struct X
{
constexpr virtual int f() const
{
return 0;
}
};
是constexpr
?
答案 0 :(得分:26)
从C ++ 20开始,这个答案不再正确。
没有。来自[dcl.constexpr] / 3(7.1.5," constexpr
说明符"):
constexpr
函数的定义应满足以下要求:- 它不应该是虚拟的
答案 1 :(得分:2)
在C ++ 17之前,virtual
函数无法声明为constexpr
。通常的原因是,在constexpr
代码中,所有事情都可以在编译时发生。因此,拥有一个引用基类并在其上调用virtual
函数的函数实在没有多大意义。您也可以将其设为template
函数并传递实类型,因为您知道实类型。
当然,随着constexpr
代码变得更加复杂,或者如果您想在编译时代码和运行时代码之间共享接口,这种想法实际上是行不通的。在这两种情况下,都很容易忘记原始类型。它还将使std::error_code
更加constexpr
更友好。
此外,C ++ 20允许我们进行(有限的)动态对象分配这一事实意味着,很容易丢失原始类型的信息。您现在可以创建一个vector<Base*>
并对其进行操作。
所以C ++ 20 allows virtual
functions to be declared constexpr
。
答案 2 :(得分:0)
虚拟函数可以是constexpr吗?
是的。 仅自C ++ 20起,虚拟函数可以为constexpr
。