const的位置指针或引用

问题描述 投票:1回答:1

对于简单类型,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。

c++ const
1个回答
4
投票

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

不,情况完全一样。

const适用于左边,除非那里没有任何东西,在这种情况下它适用于右边。

编译器(或其他任何人)绝对没有办法知道你对const const std::string * & ppp的意思。

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

© www.soinside.com 2019 - 2024. All rights reserved.