Const放置停止编辑指针数据与boost shared_ptr

Const placement to stop editing of pointer data with boost shared_ptr

本文关键字:boost shared ptr 数据 指针 编辑 Const      更新时间:2023-10-16

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

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];
    }
}

附加:在Brian的回答之后

如果我创建一个指针,像这样:

boost::shared_ptr<vector<int>> lala

我在这个函数中使用它:

function (const boost::shared_ptr<std::vector<const int>> var)

可以吗?

是的,int const * const varconst int * const var是一样的。由于"历史原因",您可以将const放在它所修改的类型之前或之后。看到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的修改。

这并不妨碍以上述方式迭代vector或其他容器,原因与您仍然可以正常迭代const vector相同。

回答问题编辑:

如此:

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-限定符更大,如本例,则可以进行转换。

不要做std::vector<const int>。我很确定那是不合法的。(至少我每次尝试的时候都会得到多个屏幕的编译错误)

const在整型的前后是相同的,所以

int const * var

const int * var

是相同的,并且表示所指向的值不能改变

const在*后表示指针不能被重新赋值。

如果我理解正确的话,您想让vector类型为const。如果是这种情况,语法应该是这样的:

void function(const boost::shared_ptr<const std::vector<int>>& var)

智能指针通过const引用传递,因为它比通过值传递智能指针更便宜,并且具有相同的效果。通过将智能指针所指向的类型声明为const,智能指针所指向的对象是不可变的。

您已经正确地推断出const shared_ptr<Foo>没有使Foo成为const对象。这个"漏洞"在维基百科上有描述。相反,您需要更改boost::shared_ptr存储的指针类型。这可以在模板参数本身中完成:

void function(const boost::shared_ptr<const std::vector<int>>& var)

boost::shared_ptr有一个复制构造函数,允许从非const类型复制const类型。相反的情况是不可能的。

之前还是之后?

下面两行在语义上是等价的,都声明了一个不能改变值的指针,指向一个不能改变的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
提供上面的 typepedef 是为了更容易看到boost::shared_ptr<int>是一个单独的名字,因此我们不能在两边加上const;重复的const (正如你提到的)是不合法的c++。

仅仅应用一个也是不够的,因为这会使包装器为const,而不是它所引用的内部对象(int)。

之前我们写过boost::shared_ptr应该绕着int转,但是既然我们想让被转的类型为const,那么……让我们用shared_ptr包裹我们想要的内容:

void func (const boost::shared_ptr<const int> foo);

上面的func不能修改foo,也不能修改foo所指的int