指针或参照的常量位置



对于简单类型,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:"正在初始化":无法从"常量"转换 std::basic_string<char,std::char_traits,std::分配器> *' 到 'const std::string *&'

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

PS:我正在Windows 10上开发Visual Studio 2015。

但是当涉及到更复杂的类型时,情况会发生变化

不,情况完全一样。

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

编译器(或其他任何人)绝对无法知道您所说的const const std::string * & ppp是什么意思。

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

最新更新