对于简单类型,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文档。不过,最好避免这种滑稽动作。