Этот код был вдохновлен другим вопросом о переполнении стека несколько дней назад. Он пытается использовать итератор преобразования для создания std::vector
, содержащего неподвижный тип.
#include <cstdio>
#include <iterator>
#include <vector>
#define BOOST_RESULT_OF_USE_DECLTYPE
#include <boost/iterator/transform_iterator.hpp>
struct NonMovable {
NonMovable(const NonMovable&) = delete;
void operator=(const NonMovable&) = delete;
NonMovable(NonMovable&&) = delete; // redundant
void operator=(NonMovable&&) = delete; // redundant
NonMovable(int x, int y) : x(x), y(y) {}
int x;
int y;
};
int main(int argc, char* argv[])
{
std::vector<int> args = {1, 2, 3, 4};
int additional_arg = 5;
auto fun = [&additional_arg](auto arg) { return NonMovable(arg, additional_arg); };
std::vector<NonMovable> v(boost::make_transform_iterator(args.begin(), fun),
boost::make_transform_iterator(args.end(), fun));
for (const auto& item : v) {
printf("%d %d\n", item.x, item.y);
}
}
К сожалению, этот код не компилируется (https://wandbox.org/permlink/20xMUsCBUg44YmXC). В сообщении об ошибке от Clang упоминается, что конструктор диапазона std::vector
отключен, потому что:
no type named 'reference' in 'std::__1::iterator_traits<boost::iterators::transform_iterator<(lambda at prog.cc:22:16), std::__1::__wrap_iter<int *>, boost::iterators::use_default, boost::iterators::use_default> >'
Но я не вижу причин, по которым в этой специализации iterator_traits
не должно быть члена с именем reference
.