为什么标准不允许"virtual void funcFoo() = 0 { }"?

why does the standard disallow "virtual void funcFoo() = 0 { }"?

本文关键字:funcFoo 不允许 标准 virtual void 为什么      更新时间:2023-10-16

[我找不到一个合适的答案。请指出我适当的链接,如果这是已经回答。]

我知道这样做是违法的,

class Base
{
public:
    virtual void funcFoo() = 0 {}   //illegal. should be defined outside the class body
    virtual ~Base() {}
};

但是这在VS2008上工作得很好。我想知道为什么标准不允许这样做?

在android上,我看到我必须定义函数inline像这样,

inline void Base::funcFoo() {}

而不是,

void Base::funcFoo() {}

这里隐式内联和显式内联的区别是什么?编译器做了什么不同?

根据§10.4/2的规定

函数声明不能同时提供纯说明符和定义

[Example:
struct C {
   virtual void f() = 0 { }; // ill-formed
};
—end example]

希望它能回答你的问题。

现在请参考@John Dibling的第一条评论(下面),因为不幸的是,你的"为什么"问题的答案不在标准中,如果"that is ill-formed"不是你可以接受的答案。语言语法根本不允许:-)

我认为这个问题没有太多的答案。它以前出现过一次(可能是在Usenet上,而不是SO——我不记得了),所以我做了一些调查。我真的没有想出什么东西。据我所知,这就是Bjarne最初的设计。虽然它可以改变,但我找不到任何向委员会提出改变的建议,也没有任何迹象表明委员会甚至辩论、讨论或考虑过它。我的猜测是,它被认为是"足够好"的方式,所以没有人愿意投入太多(任何)努力来改变它。

第一个问题已经回答了——标准就是不允许。

第二个问题是:

在android上,我知道我必须这样做像这样定义内联函数

inline void Base::funcFoo() {}

而不是,

void Base::funcFoo() {}

是什么隐式内联和这里有显式内联吗?是什么?编译器做的不同?

不同之处在于第一个变量可以放在头文件中,头文件可以被多个源文件包含。第二个变体必须正好放在一个源文件中。