为什么标准不允许"virtual void funcFoo() = 0 { }"?
why does the standard disallow "virtual void funcFoo() = 0 { }"?
[我找不到一个合适的答案。请指出我适当的链接,如果这是已经回答。]
我知道这样做是违法的,
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() {}
是什么隐式内联和这里有显式内联吗?是什么?编译器做的不同?
不同之处在于第一个变量可以放在头文件中,头文件可以被多个源文件包含。第二个变体必须正好放在一个源文件中。
相关文章:
- 为什么 Clang 不允许"and"作为函数名称?
- 不允许在向量中添加更多元素
- std::带有自定义缓冲区的 iostream 不允许我写入
- Visual Studio 2017 不允许我创建 C++ 专用模板
- 返回时不允许隐式转换
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么 c++ 不允许(自动)强制转换?
- 为什么 c++11 不允许使用自动
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 为什么不允许使用可变长度数组作为向量元素?
- 余数除法和不允许除以零 (c++) 时遇到问题
- C++从外部类继承的嵌套类;不允许使用不完整的类型
- 在 c++ 中三元运算符中不允许继续(关键字)吗?
- 为什么在指向对象的迭代器上调用函数不允许我更改对象本身?
- 错误:在第 6 行'{'标记之前,此处不允许使用函数定义
- 不允许在类定义之外重写
- 不允许运算符 const 参数调用 const 成员函数
- E0322:不允许使用抽象类类型 " " 的对象
- error dllimport 函数的定义不允许在一个特定的联合中,而其他类、结构和联合将按预期导出
- 为什么标准不允许"virtual void funcFoo() = 0 { }"?