[我找不到一个合适的答案。请指出我适当的链接,如果这是已经回答。]
我知道这样做是违法的,
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() {}
是什么隐式内联和这里有显式内联吗?是什么?编译器做的不同?
不同之处在于第一个变量可以放在头文件中,头文件可以被多个源文件包含。第二个变体必须正好放在一个源文件中。