mam:Kopiowanie wektor <shared_pt<T>> do wektora <shared_ptr <const T>> (różne przypadki) C++
std::vector<std::shared_ptr<T>>
której chciałbym skopiować do
std::vector<std::shared_ptr<const T>>
Teraz zauważyłem, że jeśli to zrobić:
class A
{
public:
A(const std::vector<std::shared_ptr<int>>& list) : internalList(list.begin(), list.end()) {}
std::vector<std::shared_ptr<const int>> internalList;
};
kompiluje grzywny (szczęk ++ std == C++ 14), ale jeśli mam zrobić:
class A
{
public:
A(const std::vector<std::shared_ptr<int>>& list) : internalList(list) {}
std::vector<std::shared_ptr<const int>> internalList;
};
Uważam, że to dziwne, że kiedy używam konstruktora kopiowania, to nie działa, ponieważ nie może wymyślić konwersji z const do const?
xxxx.cpp:672:56: error: no matching constructor for initialization of 'std::vector<std::shared_ptr<const int> >'
Może ktoś wyjaśnić, dlaczego proszę, a jeśli tak, jak to zrobić (za pomocą iteratora w konstruktorze) jest najlepszym rozwiązaniem?
Byłoby dobrze, gdyby było * tylko * konwersją z nie-const na const (tj. 'Int' na' const int'). Jednak to nie jest to, co się tutaj dzieje, to konwersja z obiektu jednego typu na obiekt zupełnie innego typu. Konstruktor kopiowania przyjmuje jako argument tylko własny typ, a nie inny typ. –
Czy to ma sens, ale czy coś takiego nie działa? 'int a = 1; const int b = a'? Więc moje pytanie brzmi: dlaczego to zadanie działa i dlaczego nie można tego zrobić za pomocą konstruktora kopii? Jestem naprawdę ciekawy, co powstrzymuje to przed zrobieniem tego? Zakładam, że nie jest to zrobione z powodów optymalizacji ... – user18490
@ user18490 'const std :: vector' nie jest tym samym, co 'std :: vector '. Stąd nie ma analogii do "int" i "const int". –