2

在我开始之前,这不是一个风格意见问题。我想知道为什么以及是否真的必须在函数之前放置存储修饰符。哲学讨论如下。

一位非常友好的 C++ 语法警察曾经教我总是在要修改的小物件之后对对象放置修饰符。例如:

int const myint; // good
const int myint; // bad

这个想法,我很喜欢他或她的推理,是修饰符总是会修改它之前的属性。所以当我们声明一个方法时,逻辑约定是这样的:

const int const fun(); // bad
int const fun() const; // good

所以假设这是我做事的方式,并且没有重新开始辩论,为什么我必须在函数之前放置存储修饰符(例如静态) ?因此,相邻的 const 和 static 函数看起来会令人困惑,如下所示:

int fun1() const;
static int fun2();

鉴于从概念上讲,此上下文中的 static 和 const 关键字具有类别相关的角色(它们都修改了函数可以做什么和不能做什么,更广泛)不应该类似的语法规则适用于它们吗?我希望能够做到这一点:

int fun1() const;
int fun2() static; // why doesn't this work?
4

3 回答 3

3

原因是它staticconst.

具体来说,static指定一个存储类,while constis a cv-qualifier(或只是qualifier,取决于您正在查看的标准)。

因此,两者的规则是相当不同的。正如您已经发现的那样,其中一个规则是存储类说明符几乎必须是声明中的第一项,并且在大多数声明中只能指定一个存储类(我知道的唯一例外: 您可以thread_localstaticextern) 一起指定。

于 2013-09-08T23:10:32.240 回答
2

static声明 a orvirtual函数 和之间有很大的区别func() const,第一种形式定义函数如何与它所属的对象交互,第二种形式定义允许对它所属的对象执行什么操作.

而且,是的,一个在函数原型之后,另一个在之前,这有点令人困惑。const char * const x = "abc"我认为这是因为如果意味着与 - 不同的东西会更加令人困惑,const char * const func() { return "abc"; }并且最好将语言中保留字的数量保持在最低限度,因此在保留字中添加“constfunc”或类似的东西被认为是个坏主意。通过将它放在()函数声明中,它可以避免混淆并允许将同一个词用于其他目的。

于 2013-09-08T23:09:54.270 回答
0

const实际上并没有修改函数,而是隐式this指针的类型。就 C++ 类型系统而言,所有函数都是不可变的(C++ 不为自修改代码提供任何语言支持)。

因此,将其位置与返回类型或函数修饰符进行比较是没有意义的。

于 2013-09-08T23:01:51.893 回答