Const放置停止编辑指针数据与boost shared_ptr
Const placement to stop editing of pointer data with boost shared_ptr
维基百科告诉我(我相信是正确的)要停止对指针和指针本身的数据的编辑我应该这样做:
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 var
和const 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>
初始化,其中T
和U
不一定是同一类型,只要U*
可以隐式转换为T*
。如果T
与U
相同,除了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
。
- 理解boost::asio-async_read在无需读取内容时的行为
- boost::进程间消息队列引发错误
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- cmake如何在fedora工作站中找到boost静态库包
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- Boost Graph Library,修复节点大小
- 什么是"#include <boost/functional/hash.hpp> "?
- 基于boost的程序的静态链接——zlib问题
- C++:如何在CLion IDE中安装Boost
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何在boost beast http请求中设置http头
- Boost Spirit,获取迭代器内部语义动作
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- boost::asio如何生成多个协同程序,然后加入它们
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- 链接 boost 库时"Error while loading shared libraries"引发的,除了我无法使用 root 访问权限来修复它
- boost::shared_ptr和std::shared-ptr的同居
- 将GoogleMock与Boost::Shared Pointers一起使用时泄漏的Mock对象
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- QSharedPointer VS std::tr1::shared_ptr VS boost::tr1::shared