在类型ID可接受的C++中是"const"吗?

T.E*_*.D. 25 c++ coding-style

我的同事是0 2上的问题,他一直激励着(1,2),所以我想我应该给他一个机会,迎头赶上.

我们最近的分歧是关于将"const"放在声明上的样式问题.

他认为它应该在类型前面,或者在指针之后.原因在于,这是其他人通常所做的事情,其他风格可能会让人感到困惑.因此,指向常量int的指针和指向int的常量指针将分别为:

const int *i;
      int * const i;
Run Code Online (Sandbox Code Playgroud)

但是,无论如何我很困惑.我需要的是一致的,易于理解的规则,我可以做的"常量"意义上的唯一方法是,它去后,它被修改的事情.有一个例外允许它在最终类型前面,但这是一个例外,所以如果我不使用它,它会更容易.

因此,指向常量int的指针和指向int的常量指针将分别为:

int const * i;
int * const i;
Run Code Online (Sandbox Code Playgroud)

作为一个额外的好处,以这种方式做事使得更深层次的间接更容易理解.例如,指向int的常量指针的指针显然是:

int * const * i;
Run Code Online (Sandbox Code Playgroud)

我的论点是,如果有人只是按照自己的方式学习,他们就可以轻松搞清楚上面的内容.

这里的最终问题是他认为将int放在int之后是如此难以言喻的丑陋,对可读性有害,以至于它应该在样式指南中被禁止.当然,我认为如果指南应该建议按照我的方式做,但无论哪种方式,我们都不应该禁止一种方法.

编辑: 我已经得到了很多好的答案,但没有一个真正直接解决我的最后一段("最终问题").很多人都争论一致性,但在这种情况下是如此理想,禁止其他方式这样做是一个好主意,而不是仅仅劝阻它?

rlb*_*ond 51

最重要的是一致性.如果没有任何编码指南,那么选择一个并坚持下去.但是,如果您的团队已经拥有事实上的标准,请不要更改它!

也就是说,我认为到目前为止更常见的是

const int* i;
int* const j;
Run Code Online (Sandbox Code Playgroud)

因为大多数人写的

const int n;
Run Code Online (Sandbox Code Playgroud)

代替

int const n;
Run Code Online (Sandbox Code Playgroud)

旁注 - 读取指针的简单方法const是从右侧开始读取声明.

const int* i; // pointer to an int that is const
int* const j; // constant pointer to a (non-const) int
int const* aLessPopularWay; // pointer to a const int
Run Code Online (Sandbox Code Playgroud)

  • 好吧 - 不是最科学的结果,谷歌代码搜索有41个结果'int const*'和824个'const int*'(用lang搜索:c ++) (14认同)
  • +1"滥用你的投票权"! (5认同)
  • 你认为更多的人会这样做吗?就个人而言,我经常看到const类型*. (3认同)
  • @finnw:我总是很惊讶为什么人们坚持“*”必须与任何东西相邻。写`int * i;`,不仅两个“阵营”都不会责怪你偏袒对方的观点,而且任何人忽视`*`的机会实际上比使用*任何一个*的可能性要小。 (2认同)

Ric*_*den 13

有一类示例将const放在类型的右侧也有助于避免混淆.

如果你在typedef中有一个指针类型,那么就不可能改变to类型的常量:

typedef int * PINT;
const PINT pi;
Run Code Online (Sandbox Code Playgroud)

'pi'仍然具有'int*const'类型,无论你在哪里写'const',这都是一样的.

  • 我不认为这太令人困惑.您的示例是const(int*),因为typedef充当分组 - 类似于(int*)const.相反,指向const的指针是(const int)*或(int const)* (5认同)
  • 如果您可以查看PINT并说:"它是一个typedef,因此const不适用于指向成员,因为*我*知道标准对typedef的说法.".如果PINT是一个宏怎么办?然后规则是不同的,CV说明符将应用于to类型.在合理的范围内,您的代码应该清晰明确,并且尽可能明确无误. (5认同)

ova*_*nes 11

我希望B. Stroustrup的风格和技术常见问题解答能给你一个明确的答案.

Bjarne Stroustrup的C++风格和技巧常见问题解答


我个人更喜欢:

int const* pi;
int* const pi;
Run Code Online (Sandbox Code Playgroud)

因为const标识了旨在成为const的左标记.

当你像这样使用smth时,你肯定保持相同的一致性:

int const* const pi;
Run Code Online (Sandbox Code Playgroud)

而不是写不一致:

const int* const pi;
Run Code Online (Sandbox Code Playgroud)

如果你有指针指针等会发生什么:

int const* const* const pi;
Run Code Online (Sandbox Code Playgroud)

代替:

const int* const* const pi;
Run Code Online (Sandbox Code Playgroud)


Nem*_*vic 8

我参加了Bjarne Stroustrup发表演讲的会议,他使用的是像const int*i这样的东西.有人问他为什么这种风格和他回应(释义):"当事情不变时,人们喜欢先看到const".

  • 遗憾的是,在一般情况下,他没有将该原则应用于"const"的语法,或者我们不会进行这种讨论. (5认同)
  • Bjarne声称他发明了const:http://www.research.att.com/~bs/bs%5Ffaq2.html#constplacement.本文还提到Bjarne最初认为是"只读". (5认同)
  • @David C++的历史可以追溯到1983年,我认为是七十年代后期的前辈"C with classes".C++首先使用const,然后使用C90将其添加到C中 (3认同)

Dan*_*son 7

人们通常使用,const int* blah因为它读得很好.我不会低估它的用处.

我发现这种int* const blah变化非常罕见,因此向后制作更常见的定义并不常见.总的来说,我并不喜欢在一般情况下甚至略微模糊代码的任何东西,尽管它可能在特殊情况下提供一些名义上的好处.

另请参见"if(1 == a)".有些人真的很喜欢编写不懂英文的代码.我不是那些人中的一个.

但实际上,const背后的规则很简单.向左看,然后向右看.如此简单,我不认为它在风格指南中值得关注.

  • 作为一个旧的C++编码器,我相信如果在常见情况下在左侧使用const的小不一致对你来说是一个问题,那么使用C语法语言就没有任何业务.它不是为了保持一致而设计的,试图强加一些它只会让你变得邋..说真的,你和你的朋友已经浪费了更多的时间来争论它,而不是选择你建议的标准化之一.解雇任何无法理解这两种语法并完成任何语法的人. (3认同)
  • 这个问题实际上出现在争论中.作为一个古老的Ada编码器,我觉得它很有趣.如果用英语读得不好的代码对你来说是一个问题,那么使用C语法语言就没有任何业务.它不是为类似英语的可读性而设计的,试图对它施加同样的效果只会让你感到沮丧. (2认同)

Dev*_*lar 6

如果只是它们的变量和指针可能const与否,那么它可能并不重要.但考虑一下:

class MyClass
{
    public:
        int foo() const;
};
Run Code Online (Sandbox Code Playgroud)

没有办法const可以写在其他任何地方,但尾随它所指的功能.

样式指南越短,开发人员就越有可能遵循它.并且可能的最短规则,以及将给您一致性唯一规则是:

const关键字总是落后不管它是指.

所以,我在这里为你的同事说0:3.

关于你的"终极问题":对于风格指南的缘故,不要紧是否先导"鼓励"或"禁令"的事情它说出来反对.这是一个社会问题,一个政策.风格指南本身应尽可能简洁明快.长篇导游只会被所有人忽略(管理层除了要注意责怪的人),所以只需写下"做"或"不做",并说明你在其他地方违反指南的行为(例如在公司政策中)如何进行同行评审).


Dav*_*ley 5

虽然const int和之间没有任何有意义的区别int const(并且我已经看过两种使用的样式),但是const int *和之间存在差异int * const.

在第一个中,您有一个指向const int的指针.您可以更改指针,但不能更改它指向的值.在第二个中,你有一个指向int的const指针.你不能改变指针(希望它根据你的喜好初始化),但是你可以改变指向int的值.

正确的比较是const int *int const *,它们都是指向const int的指针.

请记住,*它并不一定像您所希望的那样有效.声明int x, y;将按预期工作,但int* x, y;声明一个指向int的指针,一个int.