Я стараюсь ладить с std::function
. Из ссылки here видно, что аргумент std::function
ctor должен быть доступен для копирования и копирования. Итак, вот небольшой пример:std :: function for not MoveConstructible function object in gcc
#include <iostream>
#include <type_traits>
#include <functional>
class A {
public:
A(int a = 0): a_(a) {}
A(const A& rhs): a_(rhs.a_) {}
A(A&& rhs) = delete;
void operator()()
{
std::cout << a_ << std::endl;
}
private:
int a_;
};
typedef std::function<void()> Function;
int main(int argc, char *argv[])
{
std::cout << std::boolalpha;
std::cout << "Copy constructible: "
<< std::is_copy_constructible<A>::value << std::endl;
std::cout << "Move constructible: "
<< std::is_move_constructible<A>::value << std::endl;
//Function f = A();
return 0;
}
У нас есть возможность копирования, копирования, но не перемещения конструктивного класса. Как я считаю, этого должно быть достаточно, чтобы обернуть его в Function
. Но если вы раскомментируете комментируемую компилятором строки, она очень расстроилась по поводу конструктора удаленных перемещений. Вот ссылка ideone. GCC 4.8.0 тоже не компилирует это.
Итак, что-то я неправильно понял о std::function
или это неправильное поведение GCC?
Просто попробовал с clang ++, там же проблема. –
I _think_ функция 'delete'd по-прежнему рассматривается во время разрешения перегрузки и в этом случае выбирается перед конструктором копирования и вызывает ошибку. Чтобы исправить, удалите объявление конструктора перемещения, поскольку он не будет неявно сгенерирован из-за существования объявленного пользователем конструктора. Кроме того, см. [Этот вопрос] (http://stackoverflow.com/questions/16897845/move-member-function-generation) для информации 'is_move_constructible'. – hmjd
@hmjd Yup. http://stackoverflow.com/q/14085620/1171191 – BoBTFish