【问题标题】:What is the difference between declaring a string with const string and string const [duplicate]用 const string 和 string const 声明字符串有什么区别 [重复]
【发布时间】:2013-11-06 00:27:09
【问题描述】:

我在网上浏览一些代码,看到了这两个声明,

const std::string strFoo = "MyFoo";

std::string const strBar = "MyBar";

我对 const 关键字的不同位置感到困惑。它的目的到底是什么?

谢谢!

【问题讨论】:

  • 没什么。该语言有意允许基本类型的初始 const 位于类型之前或之后,但仅适用于特定的 decl 形式。 const char *char const * 是另一个这样的例子。目的是声明上述变量的不可变状态。

标签: c++


【解决方案1】:

在这种情况下,没有区别

对于更复杂的声明,它可能会产生很大的不同。

你可以说const适用于左边的东西,如果那里什么都没有,它适用于右边的东西。

例如在指向 int 的指针上使用 const 限定符:

const int* ptr1;        // (1.) pointer to const int
int const * ptr2;       // (2.) same as 1.
int* const ptr3;        // (3.) const pointer to int
const int* const ptr4;  // (4.) const pointer to const int
int const * const ptr4; // (5.) same as 4.

有关如何阅读复杂类型声明的更多信息,请参阅:C Right-Left Rule

【讨论】:

  • -1 表示顺时针/螺旋规则。该规则破坏了优先顺序,因此它甚至无法解析像int a[4][5] 这样的声明。它也过于复杂。改用右-左规则:ieng9.ucsd.edu/~cs30x/rt_lt.rule.html,它简单地遵循优先顺序,没有关于“顺时针方向”的错误假设。
  • @kotlomoy 如果您在螺旋中一次通过解析像[][] 这样的符号,它就可以工作。但是查看您提供的链接,左右规则确实看起来更直观(虽然它没有提到如何处理 const 限定符,但太糟糕了)。我已经更新了我的答案。
  • +1 表示版本。 const 限定符遵循优先顺序,因此左右规则效果很好。例如,int const * const ptr4; - 从ptr4 向左解析,我们得到“const pointer to const int”。有一个明显的丑陋例外——由于某种原因,它被允许将const 写在像这里这样的类型的左侧:const int* ptr1;。我真的不喜欢这样,因为它破坏了优先顺序,因此破坏了左右规则。
猜你喜欢
  • 2010-12-29
  • 2016-06-25
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
相关资源
最近更新 更多