【问题标题】:C++ constexpr final virtual functions [duplicate]C ++ constexpr最终虚函数[重复]
【发布时间】: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 函数都是关于编译器确切知道实现是什么的。我看不出组合它们的结果应该是什么。
  • @JeffG 关于:" 奇怪,我真的不明白非最终函数如何可能被编译器视为constexpr,但没关系。" .考虑通过指针或引用不访问对象的情况。假设您声明了一个变量,如constexpr B obj;,然后称为obj.foo();。在这种情况下,不需要函数的运行时查找,因为它知道对象的真实类型是什么。电话是B::foo()。 在另一个层面上,您正在寻找的答案可能涉及“这没有问题,所以不要使语言规范复杂化”。

标签: c++ virtual constexpr final


【解决方案1】:

【讨论】:

    猜你喜欢
    • 2011-10-10
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多