以下代码中的虚函数 X::f()
是否可以被调用?
struct X
{
constexpr virtual int f() const
{
return 0;
}
};
如何成为constexpr
?
以下代码中的虚函数 X::f()
是否可以被调用?
struct X
{
constexpr virtual int f() const
{
return 0;
}
};
如何成为constexpr
?
截至C++20,此答案已不再正确。
不可以。根据[dcl.constexpr]/3 (7.1.5, "The constexpr
specifier")的规定:
constexpr
函数的定义应满足以下要求:— 不能是虚函数
virtual
函数无法被声明为constexpr
。一般来说,这是因为在constexpr
代码中,所有的操作都必须在编译时完成。因此,在一个函数中传递一个基类的引用并调用其中的virtual
函数并没有太多意义;你可以将其定义为一个template
函数并传递真实类型,因为你知道真实类型。
当然,随着constexpr
代码变得越来越复杂,或者你希望在编译时和运行时之间共享接口时,这种思路就不再适用了。在这两种情况下,很容易失去原始类型的跟踪。这也将使std::error_code
更加友好。
此外,C++20允许我们进行(有限的)动态对象分配,这意味着很容易失去原始类型的跟踪。现在,您可以在constexpr
代码中创建一个vector<Base*>
,将一些Derived
类的实例插入其中,并将其传递给constexpr
函数进行操作。
因此,C++20 允许声明virtual
函数为constexpr
。
const
引用允许数组大小成为实际标记列表上的NTTP是相对清晰的解决方法之一,但由于缺少constexpr virtual
而引入了自己的问题。很高兴看到这很快就会推出! - Justin Time - Reinstate Monica虚函数能否是常量表达式(
constexpr
)?
能。自 C++20 开始,虚函数可以是 constexpr
。
constexpr
的目的。 - πάντα ῥεῖX
,则这样的假设函数只能用作常量表达式。这基本上需要语言指定“去虚拟化规则”。 - Kerrek SB