Этот пример программы не компилируется, потому что transform_view
нельзя преобразовать в std::span
:
class Foo {
private:
std::vector<std::string> strings = { "a", "b", "c" };
public:
std::span<const char*> getStrings() {
return strings | std::views::transform([](const std::string& str) { return str.c_str(); });
}
};
int main() {
Foo foo;
auto strings = foo.getStrings();
for (auto s : strings)
std::cout << s << std::endl;
}
Я знаю, что пока нельзя построить контейнеры (типа std::vector
), однако я не совсем понимаю, почему из него нельзя построить std::span
. Я нашел этот ответ, в котором говорилось, что в настоящее время единственным контейнером, который может быть создан из произвольного диапазона, является std::span
, поэтому я ожидал, что приведенный выше пример будет работать.
Есть ли способ создать диапазон из диапазона? Или есть другой способ вернуть общее представление из метода без использования auto
(что не разрешено для виртуальных методов)?
std::span
не может быть построено из произвольного диапазона. Это просто легковесный просмотрщик непрерывного диапазона. - person ALX23z   schedule 12.05.2021