虚函数可以是constexpr吗?

时间:2016-01-16 14:34:02

标签: c++ c++11 virtual-functions constexpr

以下代码中的虚拟函数如X::f()

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

constexpr

3 个答案:

答案 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