对于简单类型,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];
其中type是const std::string *
,我不能把ppp
的定义写成
const const std::string * & ppp = &vw[0];
因为编译器发出错误:
错误C2440:'初始化':无法从'const std :: basic_string <char,std :: char_traits,std :: allocator> *'转换为'const std :: string *&'
所以我的问题是:在这种情况下,为什么我不能在常量之前加上const的&?我试图添加括号以帮助编译器工作,但只产生更多错误。谢谢。
PS:我正在使用Windows 10上的Visual Studio 2015。
但是当涉及更复杂的类型时,情况会发生变化
不,情况完全一样。
const
适用于左边,除非那里没有任何东西,在这种情况下它适用于右边。
编译器(或其他任何人)绝对没有办法知道你对const const std::string * & ppp
的意思。
你的const const double * pip1 = &pi
的例子也是非法的,doesn't compile with GCC;如果Visual Studio接受它,这是一些奇怪的非标准扩展 - 要理解它(以及如何在你描述的情况下使用它),你将不得不参考Microsoft文档。不过,最好避免这种滑稽动作。