指针或引用的const位置

时间:2019-02-14 21:31:20

标签: c++ const

对于简单类型,const在*或&左侧的位置具有相同的效果。那就是:

const type *

等效于

type const *

(也是参考)。例如:

const double pi = 3.14159;
const const double * pip1 = π
const double const * pip2 = π
const double & pir1 = pi;
double const & pir2 = pi;

pip1和pip2以及pir1和pir2都相同,并且编译器接受它们而没有任何错误。

但是,当涉及到更复杂的类型时,情况发生了变化。对于以下代码:

const std::vector<std::string> vs(10);
const std::string * const & ppp = &vs[0];

类型为const std::string *的地方,我无法将ppp的定义写为

const const std::string * & ppp = &vw[0];

因为编译器发出错误:

  

错误C2440:“正在初始化”:无法从“ const”转换   std :: basic_string *'   到'const std :: string *&'

所以我的问题是:为什么在这种情况下我不能将&的常量放在*的常量之前?我试图添加括号以帮助编译器工作,但仅产生了更多错误。谢谢。

PS:我正在使用Windows 10上的Visual Studio 2015。

1 个答案:

答案 0 :(得分:4)

  

但是当涉及到更复杂的类型时情况就变了

不,情况完全一样。

const适用于左侧,除非那里什么也没有,在这种情况下,适用于右侧。

编译器(或其他任何人)绝对无法了解const const std::string * & ppp的含义。

您的const const double * pip1 = &pi示例也是非法的,并且doesn't compile with GCC;如果Visual Studio接受它,那是一些奇怪的非标准扩展名-要理解它(以及在您描述的情况下如何使用它),您必须参考Microsoft文档。不过,最好避免这样的滑稽动作。