当前位置:  开发笔记 > 编程语言 > 正文

基于const shared_ptr <>的循环范围

如何解决《基于constshared_ptr<>的循环范围》经验,为你挑选了1个好方法。

我有一个容器shared_ptr<>,例如a vector> v,我想迭代v指示const-ness.

这段代码:

vector> v;
v.push_back(make_shared("hallo"));
...

for (const auto &s : v) {
    *s += ".";   // <<== should be invalid
}

看起来像我想要做的(表明那sconst)但当然它不会成为字符串const.

是否有一种优雅的方法来迭代一个容器,shared_ptr明确表示内容不会被修改?

就像是

for (shared_ptr s : v) {
    *s += ".";   // <<== will not compile
}

(但是这段代码不会因其他原因编译:))

编辑:

我犯了一个错误.最初我正在声明一个引用,这会导致编译器错误

for (shared_ptr &s : v) {   // <<== does not compile
    ...
}

如果您声明shared_ptr该示例有效.在我看来,这是一个很好的权衡,但这样一来指针被复制,这在循环中耗费大量代码和大容器时会很费时间.



1> Lightness Ra..:

这是C++的一个众所周知的限制,有些人不认为这是一个限制.

你想迭代const,但不可变指针并不意味着不可变的指针.

类型shared_ptr和类型shared_ptr实际上是无关的.

选项1

for (const auto& ptr : v) {
    const auto& s = *ptr;

    s += ".";   // <<== is invalid
}

选项2

只是不要修改它.


如果`ptr`为空,是否会导致未定义的行为?
推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有