【发布时间】: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