Рассмотрим следующий фрагмент кода
#include <algorithm>
#include <iostream>
#include <memory>
#include <vector>
struct Base {
int x;
Base(int x) : x(x) {}
};
struct Derived : public Base {
int y, z;
Derived(int x) : Base(x), y(x + 1), z(x + 2) {}
};
void update(const std::vector<std::shared_ptr<const Base>>& elements) {
for (const auto elem : elements) {
std::cout << elem->x << "\n";
}
}
int main(int, char**) {
std::vector<std::shared_ptr<Derived>> elements(4);
{
int ctr = 0;
std::generate(begin(elements), end(elements), [&ctr]() { return std::make_shared<Derived>(++ctr); });
}
// update(elements); // note: candidate function not viable: no known conversion from 'vector<shared_ptr<Derived>>' to 'const vector<shared_ptr<const Base>>' for 1st argument
update(reinterpret_cast<std::vector<std::shared_ptr<const Base>>&>(elements)); // ok
return 0;
}
Мой вопрос заключается в том, возможно ли использование reinterpret_cast
для приведения от std::vector<std::shared_ptr<Derived>>
к std::vector<std::shared_ptr<const Base>>&
и принято ли стандартом.
Я скомпилировал код с clang-3.8 и gcc-6.1 с -fsanitize=undefined
, и вроде все в порядке. Однако я, кажется, не могу найти правильного объяснения cppreference.
Конечно, я могу легко создать соответствующую функцию, но она длиннее однострочного reinterpret_cast и требует временного вектора.
void update(const std::vector<std::shared_ptr<Derived>>& elements) {
std::vector<std::shared_ptr<const Base>> casted(elements.size());
std::copy(begin(elements), end(elements), begin(casted));
update(casted);
}