对于简单类型,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。
答案 0 :(得分:4)
但是当涉及到更复杂的类型时情况就变了
不,情况完全一样。
const
适用于左侧,除非那里什么也没有,在这种情况下,适用于右侧。
编译器(或其他任何人)绝对无法了解const const std::string * & ppp
的含义。
您的const const double * pip1 = &pi
示例也是非法的,并且doesn't compile with GCC;如果Visual Studio接受它,那是一些奇怪的非标准扩展名-要理解它(以及在您描述的情况下如何使用它),您必须参考Microsoft文档。不过,最好避免这样的滑稽动作。