在开始之前,这不是一个风格意见问题。我想知道为什么以及如果我真的必须在函数之前放置存储修饰符。接下来是哲学讨论。
一位非常友好的C ++语法警察曾经教过我总是在修改doodad之后将修饰符放在对象上。例如:
int const myint; // good
const int myint; // bad
这个想法,我非常喜欢他或她的推理,然后修饰符将始终在它之前修改属性。因此,当我们声明一个方法时,逻辑约定如下:
const int const fun(); // bad
int const fun() const; // good
因此,假设这是我做事的方式,并且没有重新开始讨论,为什么我必须在函数之前放置存储修饰符(例如静态)?因此,彼此相邻的const和静态函数会令人困惑地看起来像这样:
int fun1() const;
static int fun2();
从概念上讲,这个上下文中的static和const关键字具有明确相关的角色(它们都修改了函数可以做什么和不能做什么,要广泛)不应该类似的语法规则适用于它们?我希望能够做到这一点:
int fun1() const;
int fun2() static; // why doesn't this work?
答案 0 :(得分:3)
原因是static
与const
完全不同。
具体来说,static
指定了一个存储类,而const
是cv-qualifier
(或仅qualifier
,具体取决于您所查看的标准。)
因此,两者的规则相当不同。正如您已经发现的那样,其中一条规则是存储类说明符几乎是声明中的第一项,并且在大多数声明中只能指定一个存储类(我知道唯一的例外) :您可以指定thread_local
以及static
或extern
)。
答案 1 :(得分:2)
声明static
或virtual
函数与func() const
之间存在很大差异,因为第一个函数定义了函数如何与它所属的对象进行交互,以及第二种形式定义允许对其所属的对象执行的操作。
而且,是的,一个人在功能原型之后,而另一个在之前,这有点令人困惑。我认为这是因为如果const char * const x = "abc"
表示与const char * const func() { return "abc"; }
不同的内容会更加令人困惑 - 并且最好将保留字的数量保持在语言中最小,因此添加“ constfunc“或类似保留词的东西被认为是个坏主意。通过将它放在函数声明中的()
之后,它可以避免混淆并允许将相同的单词用于其他目的。
答案 2 :(得分:0)
const
实际上并不修改函数,而是隐式this
指针的类型。就C ++类型系统而言,所有函数都是不可变的(C ++不为自修改代码提供任何语言支持)。
因此,将其位置与返回类型或函数修饰符进行比较是没有意义的。