gpt4 book ai didi

c++ - 纯虚函数可能没有内联定义。为什么?

转载 作者:IT老高 更新时间:2023-10-28 13:22:20 25 4
gpt4 key购买 nike

纯虚函数是那些具有纯说明符(= 0;)的虚成员函数

C++03 的第 10.4 条第 2 段 告诉我们什么是抽象类,并附带说明以下内容:

[注意:函数声明不能​​同时提供纯说明符和定义——尾注] [例子:

struct C {
virtual void f() = 0 { }; // ill-formed
};

——结束示例]

对于不太熟悉这个问题的人,请注意纯虚函数可以有定义,但上述条款禁止此类定义出现在行内 (类中的词汇)。 (对于定义纯虚函数的用法,您可能会看到,例如 this GotW)

现在对于所有其他种类和类型的函数,它可以提供一个类内定义,而且这个限制乍一看似乎完全是人为的和莫名其妙的。想想看,第二眼和随后的眼光似乎都是这样 :) 但我相信如果没有具体原因,限制就不会存在。

我的问题是:有人知道这些具体原因吗? 好的也欢迎猜测。

注意事项:

  • MSVC 确实允许 PVF 具有内联定义。所以不要惊讶:)
  • 本题中的inline 一词并非指inline 关键字。它应该表示在类中的词法

最佳答案

在 SO 线程 "Why is a pure virtual function initialized by 0?" Jerry Coffin 提供了 Bjarne Stroustrup 的 The Design & Evolution of C++ 中的这句话。 ,第 13.2.3 节,我在其中添加了一些我认为相关的部分的重点:

The curious =0 syntax was chosen over the obvious alternative of introducing a new keyword pure or abstract because at the time I saw no chance of getting a new keyword accepted. Had I suggested pure, Release 2.0 would have shipped without abstract classes. Given a choice between a nicer syntax and abstract classes, I chose abstract classes. Rather than risking delay and incurring the certain fights over pure, I used the tradition C and C++ convention of using 0 to represent "not there." The =0 syntax fits with my view that a function body is the initializer for a function and also with the (simplistic, but usually adequate) view of the set of virtual functions being implemented as a vector of function pointers. [ … ]

因此,在选择语法时,Bjarne 将函数体视为声明器的一种初始化部分,而 =0 作为初始化器的另一种形式,表示“没有主体” (或者用他的话来说,“不存在”)。

理所当然地,一个人不能既表示“不存在”又拥有一个 body ——在那个概念图中。

或者,仍然在那个概念图中,有两个初始化器。

现在,这就是我的心灵感应能力、google-foo 和软推理能力。我推测没有人足够感兴趣™ 向委员会提出关于取消这种纯粹的句法限制并跟进所有工作的提案。所以还是这样。

关于c++ - 纯虚函数可能没有内联定义。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4174694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com