Захват по ссылке в boost :: phoenix :: lambda

Я могу создать boost::phoenix::lambda что захватывает по значению. Однако попытка изменить переменную, захваченную значением, приводит к следующей ошибке

error: read-only variable is not assignable
BOOST_PROTO_BINARY_DEFAULT_EVAL(=, assign, make_mutable, make)

Имеет смысл, просто захватить ссылку. Захват по ссылке приводит к следующей ошибке в clang 3.2:

error: call to 'ref' is ambiguous
auto a = lambda(_a = ref(dv), _b = ref(i))[ _a[arg1] = _b, _a[arg1] ];
^~~

/usr/include/c++/v1/__functional_base:388:1: note: candidate function [with _Tp =
std::__1::vector<double, std::__1::allocator<double> >]
ref(_Tp& __t) _NOEXCEPT
^
/usr/local/include/boost/phoenix/core/reference.hpp:68:12: note: candidate function [with T
= std::__1::vector<double, std::__1::allocator<double> >]
inline ref(T & t)
^

В следующем примере мне нужно захватить по ссылке, чтобы получить код, эквивалентный лямбда-выражению C ++ 11. Какой правильный способ захвата по ссылке в boost::phoenix::lambda ?

Минимальный пример:

#include<iostream>
#include<vector>
#include<boost/phoenix/phoenix.hpp>
using namespace boost::phoenix;
using namespace boost::phoenix::placeholders;
using namespace boost::phoenix::local_names;

template<class D = void> struct A {
A() : i(1), dv(2,2) {}
int i; std::vector<int> dv;
void fun() {
//auto a = [&](int j){ dv[j] = i; return dv[j]; }; // C++11

// boost::phoenix capture by value works, does not modify dv.
//auto a = lambda(_a = val(dv), _b = val(i))[ _a[arg1] + _b];

// boost::phoenix capture by value: modifying the vector does not work.
auto a = lambda(_a = val(dv), _b = val(i))[ _a[arg1] = _b, _a[arg1] ];

// boost::phoenix capture by reference: doesn't work.
auto a = lambda(_a = ref(dv), _b = ref(i))[ _a[arg1] = _b, _a[arg1] ];
for(size_t t = 0; t != dv.size(); ++t) {
std::cout << "vt: " << a()(t) << std::endl;
}
}
};

int main() {
A<void> a;
a.fun();
return 0;
}

Обновление 1: Удалены using namespace std; (предложено Xeo в комментариях).

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector