Использование spreadate_const для вектора умных указателей - PullRequest
0 голосов
/ 14 января 2020

Как вы можете использовать propagate_const для построения std::vector<std::shared_ptr<const X>> из std::vector<std::shared_ptr<X>>?

После прочтения Превращая вектор shared_ptr в вектор shared_ptr в const , я пытался реализовать это в моем собственном коде, но не приведен минимальный рабочий пример. Пример, приведенный в cpp документах, мне не помог. Можно ли даже использовать propagate_const таким образом?

Вот мой минимальный нерабочий пример:

#include <memory>
#include <vector>
#include <experimental/propagate_const>

struct B {int x;};

struct A {
    std::vector<std::experimental::propagate_const<std::shared_ptr<B>>> v_;

    std::vector<std::shared_ptr<const B>> & v() const {
        return v_;
    }
};

int main(int argc, char* argv[]) {
    A a = A();
    std::vector<std::shared_ptr<const B>> const v = a.v();
}

Не удается скомпилировать следующее сообщение об ошибке:

error: invalid initialization of reference of type
‘std::vector<std::shared_ptr<const B> >&’
from expression of type
‘const std::vector<std::experimental::fundamentals_v2::propagate_const<std::shared_ptr<B> > >’
11 |         return v_;

Если это невозможно решить с помощью propagate_cast, каким другим способом вы бы предложили избежать создания нового вектора?

...