0

[我找不到正确的答案。如果已经回答,请指出正确的链接。]

我知道做这样的事情是违法的,

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

但这在 VS2008 上运行良好。我想知道为什么标准不允许这样做?

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

inline void Base::funcFoo() {}

而不仅仅是,

void Base::funcFoo() {}

这里隐式内联和显式内联有什么区别?编译器有什么不同?

4

3 回答 3

4

根据第 10.4/2 节,这是格式错误的,该节(在注释中)说,

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

[Example:

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

—end example]

希望它能回答你的问题。

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

于 2011-04-19T20:36:32.810 回答
1

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

于 2011-04-19T20:43:28.367 回答
0

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

第二个问题是:

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

inline void Base::funcFoo() {}

而不仅仅是,

void Base::funcFoo() {}

这里隐式内联和显式内联有什么区别?编译器有什么不同?

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

于 2011-04-19T20:41:48.090 回答