c++ - 基于范围的 for 循环与 const shared_ptr<>

标签 c++ pointers iteration constants container-data-type

我有一个容器 shared_ptr<> ,例如一个vector<shared_ptr<string>> v我想遍历 v表示常量。

这段代码:

vector<shared_ptr<string>> v;
v.push_back(make_shared<std::string>("hallo"));
...

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

看起来 就像我想做的(表示 sconst )但当然它不会生成字符串 const .

有没有一种优雅的方法来遍历 shared_ptr 的容器?这表明内容不会被修改?

有点像

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

(但由于其他原因这段代码无法编译:))

编辑:

我错了。最初我是在声明一个引用,这导致编译器错误

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

如果你声明一个 shared_ptr<const string>这个例子有效。在我看来,这是一个很好的权衡,但这种方式会复制指针,这在代码很少和容器很大的循环中可能很耗时..

最佳答案

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

您想迭代 const ly,但不可变指针并不意味着不可变指针。

类型shared_ptr<string>和类型 shared_ptr<const string>实际上是无关的。

选项 1

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

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

选项 2

只是不要修改它。

关于c++ - 基于范围的 for 循环与 const shared_ptr<>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34515918/

相关文章:

javascript - 使用迭代样式在 JavaScript 中克隆对象

c++ - 在 C++ 中读取返回零

c++ - 已调用 WM_TIMER 消息但未设置计时器

c++ - 如何定义全局函数指针并分配给特定地址

c - 如何将结构体中的指针直接分配给新结构体?

java - 在不应该使用整数和 double 时会给出不同的答案

java - 将新元素插入字节数组

c++ - 使用 stringstreams 加速 std::cout 日志记录

c++ - 从 C++ 连接到 QML 图表

c - 函数中的指针更改地址但在其外部指向 0x0