[我找不到合适的答案。如果已经回答,请指出正确的链接。]
我知道做这样的事情是违法的,
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() {}
这里隐式内联和显式内联的区别是什么?什么是编译器做的不同?
答案 0 :(得分:4)
根据§10.4/ 2节(在说明中)说,
这是不正确的函数声明不能同时提供纯指定符和定义
[Example:
struct C {
virtual void f() = 0 { }; // ill-formed
};
—end example]
希望它能回答你的问题。
现在请参考@John Dibling的第一条评论(下面),遗憾的是,您的“为什么”问题的答案不在标准中,如果"that is ill-formed"
不是您可接受的答案。语言语法根本不允许它。: - )
答案 1 :(得分:1)
我认为对此没有太多答案。它曾经出现过一次(可能是在Usenet而不是SO - 我不记得了),所以我做了一些寻找。我并没有真正想出任何东西。据我所知,这就是Bjarne最初设计的方式。虽然可以改变,但我找不到委员会提出的任何改变建议,也没有任何迹象表明委员会甚至根本没有辩论,讨论或考虑过。我的猜测是它被认为是“足够好”,所以没有人愿意投入太多(任何?)努力来改变它。
答案 2 :(得分:0)
第一个问题已经得到解答 - 标准只是不允许它。
第二个问题是:
在android上,我看到我必须这样做 像这样定义函数内联,
inline void Base::funcFoo() {}
而不仅仅是,
void Base::funcFoo() {}
是什么? 隐式内联和差异的差异 在这里明确内联?是什么 编译器做的不同吗?
不同之处在于第一个变体可以放在头文件中,头文件可以包含在多个源文件中。第二个变体必须放在一个源文件中。