Const放置以使用boost shared_ptr停止编辑指针数据

时间:2014-06-05 01:59:25

标签: c++ pointers boost const

所以维基百科告诉我(正确的我相信)停止编辑指针和指针本身的数据,我应该这样做:

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)

那会有用吗?

4 个答案:

答案 0 :(得分:2)

是的,int const * const varconst 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>初始化,其中TU不一定相同类型,只要U*可隐式转换为T*。如果TU相同,除了cv-qualification更高,因为在这种情况下,转换是可能的。

不要做std::vector<const int>。我很确定这不合法。 (至少我每次尝试都会有多个编译错误屏幕。)

答案 1 :(得分:1)

int之前或之后的

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类型。相反的情况应该不可能。