虚函数可以是constexpr吗?

Ral*_*zky 15 c++ virtual-functions constexpr c++11

可以X::f()在下面的代码中使用虚函数

struct X 
{
    constexpr virtual int f() const 
    {
        return 0;
    }
};
Run Code Online (Sandbox Code Playgroud)

constexpr吗?

Ker*_* SB 28

从[dcl.constexpr]/3(7.1.5," constexpr说明符"):

constexpr功能的定义应满足以下要求:

- 它不应该是虚拟的

  • 请注意,虚拟constexpr在c ++ 20中是合法的。参见https://en.cppreference.com/w/cpp/language/constexpr (4认同)
  • @zaratustra:和GCC 6 [不](http://melpon.org/wandbox/permlink/ZTDx83wihHNGZBj8):-( (3认同)
  • Clang ++不接受链接中的代码. (2认同)
  • @CiroSantilli华涌低端人口六四事件法轮功:"虚拟"的意思是"在运行时"."constexpr"表示"在编译时". (2认同)
  • 可以在编译时确定其状态的多态constexpr对象 (2认同)

Naw*_*waz 18

虚函数可以 constexpr 吗?

是的。从 C++20 开始,才可以使用虚函数constexpr


Nic*_*las 6

在C ++ 17之前,virtual无法声明函数constexpr。通常的原因是,在constexpr代码中,所有事情都可以在编译时发生。因此,拥有一个引用基类并virtual在其上调用函数的函数确实没有多大意义。您也可以使其成为一个template函数并传递实型,因为您知道实型。

当然,随着constexpr代码变得更加复杂,或者如果您想在编译时代码和运行时代码之间共享接口,这种想法实际上是行不通的。在这两种情况下,都很容易忘记原始类型。这也std::error_code将使其更加constexpr友好。

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

因此C ++ 20 允许virtual声明函数constexpr