C ++ constexpr最终虚函数[重复]

Posted

技术标签:

【中文标题】C ++ constexpr最终虚函数[重复]【英文标题】:C++ constexpr final virtual functions [duplicate] 【发布时间】:2021-06-24 00:11:18 【问题描述】:

我在 C++ 派生类中实现一个纯虚函数,并标记方法final。我还想标记函数constexpr,但标准似乎不允许这样做。

编译器难以实现这一点是否有任何实际原因?还是因为通常的“此功能被认为不够重要而无法添加到标准中”的想法而省略了这样的功能?

根据 cmets,我最初的问题似乎没有明确说明我在询问 constexpr final 函数。以下代码说明了我要编译的内容:

struct A 
    virtual int foo() const;
;

struct B : public A 
    // Note that this function is final, and is therefore no longer
    // polymorphic in types derived from B (e.g., the function call
    // no longer requires a lookup in the virtual method table
    // when the compile-time type is known to be derived from B)
    constexpr int foo() const final 
        return 0;
    
;

请注意,这被标记为 Can virtual functions be constexpr? 的重复项,因为在 C++20 中,无论是否使用 final 关键字,上述代码都可以编译。

【问题讨论】:

你是用 C++20 编译的吗? 虚拟多态在编译时不起作用,这将完全违背它的目的。如果您需要静态多态性,它适用于constexpr,您仍然可以使用良好的 ole CRTP。 virtual 函数都是关于编译器不知道实现可能是什么。 constexpr 函数都是关于编译器确切知道实现是什么的。我看不出组合它们的结果应该是什么。 相关:***.com/questions/34828161/… @JeffG 关于:" 奇怪,我真的不明白非最终函数如何可能被编译器视为constexpr,但没关系。" .考虑通过指针或引用访问对象的情况。假设您声明了一个变量,如constexpr B obj;,然后称为obj.foo();。在这种情况下,不需要函数的运行时查找,因为它知道对象的真实类型是什么。电话是B::foo()在另一个层面上,您正在寻找的答案可能涉及“这没有问题,所以不要使语言规范复杂化”。 【参考方案1】: C++20 增加了对此代码的支持。 在godbolt上,我们可以试试:https://godbolt.org/z/f64e93dzY 看起来这是Defect Report 647

【讨论】:

以上是关于C ++ constexpr最终虚函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将constexpr作为函数参数传递c ++ [重复]

C++virtual函数重写,在继承的时候没有写关键字也仍然是虚函数吗?

虚函数

虚函数表指针个数

C++面试必备

虚函数与作用域