У меня есть следующий код:Использование Повысьте эффективность адаптеров с станд :: затруднительное выражения
#include <boost/range/adaptor/transformed.hpp>
#include <boost/range/algorithm.hpp>
#include <iostream>
#include <functional>
#include <memory>
struct A {
A() = default;
A(const A&) = delete;
A& operator=(const A&) = delete;
};
struct B {
B() = default;
B(const B&) = delete;
B& operator=(const B&) = delete;
int foo(const A&, int b) {
return -b;
}
};
int main() {
A a;
auto b = std::make_shared<B>();
std::vector<int> values{1, 2, 3, 2};
using std::placeholders::_1;
auto fun = std::bind(&B::foo, b.get(), std::ref(a), _1);
int min = *boost::min_element(values | boost::adaptors::transformed(fun));
std::cout << min << std::endl;
}
Когда я пытаюсь скомпилировать его, лязг дает следующее сообщение об ошибке (полный выход here):
/usr/local/include/boost/optional/optional.hpp:674:80: error: object of type 'std::_Bind<std::_Mem_fn<int (Base::*)(const A &, int)> (Base *, std::reference_wrapper<A>, std::_Placeholder<1>)>' cannot be assigned because its copy assignment operator is implicitly deleted
Кажется, что, хотя объект bind имеет конструктор копирования, его оператор назначения копирования удаляется. Я получаю ту же ошибку, если попытаюсь использовать лямбда вместо bind
.
Является ли это ошибкой в стандарте C++ 11, реализации libstdC++ или реализации адаптера Boost?
Что является лучшим обходным решением для этого? Я могу обернуть его в
std::function
. Кажется, что работает иboost::bind
. Что является более эффективным, или это действительно имеет значение?
2) 'boost :: bind' более эффективен, чем' std :: function' – David