所以维基百科告诉我(正确的我相信)停止编辑指针和指针本身的数据,我应该这样做:
void function(int const * const var)
这与此功能相同:
void function(const int * const var)
在那种情况下,为什么允许这样做?因为我知道你因为重复的const编译错误而无法做到这一点:
void function(const int const * const var)
我基本上想用增强指针做同样的事情。我会这样做:
void function(const boost::shared_ptr<int> const var)
这将如何影响我循环的能力说一个指向矢量的共享指针?我可以和那个警卫一起做这件事:
void function(const boost::shared_ptr<std::vector<int>> const var)
{
for (unsigned int i = 0; i < var->size(); ++i)
{
std::cout << var[i];
}
}
Adition:Brian回答后
所以如果我创建一个像这样的指针:
boost::shared_ptr<vector<int>> lala
我在这个功能中使用它:
function (const boost::shared_ptr<std::vector<const int>> var)
那会有用吗?
答案 0 :(得分:2)
是的,int const * const var
与const int * const var
相同。您可以在其修改的类型之前或之后放置const
,以及&#34;历史原因&#34;。见http://www.stroustrup.com/bs_faq2.html#constplacement
对于智能指针对象,你确实无法做到
const boost::shared_ptr<int> const
因为const
都修改了相同的类型。相反,你想要
const boost::shared_ptr<const int>
第一个const
阻止指针本身被修改(即,重新分配以指向另一个int
)并且模板参数中的const
告诉对象的operator*
返回const int&
,这会阻止修改指向的int
。
这不会阻止以您描述的方式对向量或其他容器进行迭代,原因与您仍然可以正常迭代const
向量的原因相同。
编辑以回复问题编辑:
这有效:
void f(const boost::shared_ptr<const std::vector<int> > var);
// ...
boost::shared_ptr<vector<int> > lala;
f(lala);
参数中的第一个const
根本不影响参数传递;它只告诉函数本身不要修改参数。我们可以在模板参数中添加const
的原因是,boost::shared_ptr<T>
可以从boost:shared_ptr<U>
初始化,其中T
和U
不一定相同类型,只要U*
可隐式转换为T*
。如果T
与U
相同,除了cv-qualification更高,因为在这种情况下,转换是可能的。
不要做std::vector<const int>
。我很确定这不合法。 (至少我每次尝试都会有多个编译错误屏幕。)
答案 1 :(得分:1)
const是相同的:
int const * var
和
const int * var
是相同的并且意味着指向的值无法更改
后面的const意味着指针无法重新分配。
如果我理解正确,你想使矢量const。如果是这种情况,语法就是这样:
void function(const boost::shared_ptr<const std::vector<int>>& var)
智能指针由const引用传递,因为它比按值传递智能指针便宜并具有相同的效果。智能指针指向的对象通过声明它指向const的类型是不可变的。
答案 2 :(得分:1)
以下两行在语义上是等效的,都声明了一个无法更改值的指针,指的是无法更改的int
。
int const * const p1 = ...;
const int * const p2 = ...;
const 关键字绑定到左边的任何内容,除非左边没有任何东西,在这种情况下它会拥抱右边的任何东西。
const
越多越好? typedef boost::shared_ptr<int> shared_int_ptr;
const shared_int_ptr const p3; // ill-formed
提供上述 typedef 是为了便于查看boost::shared_ptr<int>
是单个名称,因此我们无法在双方添加const
;重复的 consts (如你所提到的)不是合法的C ++。
仅应用一个也不够,因为这会使包装器 const ,而不是它所引用的内部对象( int )。
以前我们写过boost::shared_ptr
应该包裹int
,但是因为我们想要创建包装类型const
,所以..让我们包装 shared_ptr 围绕我们想要的东西:
void func (const boost::shared_ptr<const int> foo);
上述func
无法修改foo
,也无法修改int
引用的foo
。
答案 3 :(得分:1)
您已经正确地推断出const shared_ptr<Foo>
并不会使Foo成为const对象。这个&#34;漏洞&#34;在wikipedia上描述。相反,您需要更改boost :: shared_ptr存储的指针类型。这可以在模板参数本身中完成:
void function(const boost::shared_ptr<const std::vector<int>>& var)
boost :: shared_ptr有一个拷贝构造函数,允许从非const类型复制const类型。相反的情况应该不可能。