Если вы не используете заполнители аргументов (_1
, _2
, ...), то любые аргументы, переданные объекту функции, возвращенному из std::bind
, будут просто отброшены. С:
std::function<void(int)> f = std::bind(fun, std::placeholders::_1);
Я получаю (длинную и уродливую) ошибку, как и ожидалось.
Для тех, кто интересуется Standardese:
§20.8.9.1.2 [func.bind.bind]
template<class F, class... BoundArgs>
*unspecified* bind(F&& f, BoundArgs&&... bound_args);
p3 Возвращает: Оболочка переадресации вызова g
со слабым типом результата (20.8.2). Эффект g(u1, u2, ..., uM)
должен быть INVOKE(fd, v1, v2, ..., vN, result_of<FD cv (V1, V2, ..., VN)>::type)
, где cv представляет cv-квалификаторы g
, а значения и типы связанных аргументов v1, v2, ..., vN
определяются, как указано ниже< /сильный>.
p10 Значения связанных аргументов v1, v2, ..., vN
и соответствующих им типов V1, V2, ..., VN
зависят от типов TiD
, полученных из вызова bind
, и cv-квалификаторов cv > оболочки вызова g
следующим образом:
- если
TiD
равно reference_wrapper<T>
, аргумент равен tid.get()
, а его тип Vi
равен T&
;
- если значение
is_bind_expression<TiD>::value
равно true
, аргумент равен tid(std::forward<Uj>(uj)...)
, а его тип Vi
равен result_of<TiD cv (Uj...)>::type
;
- если значение
j
из is_placeholder<TiD>::value
не равно нулю, аргумент равен std::forward<Uj>(uj)
, а его тип Vi
равен Uj&&
;
- в противном случае значение равно
tid
, а его тип Vi
равен TiD cv &
.
person
Xeo
schedule
23.04.2013
std::bind(fun)
, потому что она содержит ошибки. :) - person Xeo   schedule 23.04.2013