Все цитаты из N3797.
4/3 [conv]
Выражение е возможно неявно преобразованный к типу T тогда и только тогда, когда декларация T t = e; хорошо сформирована, для некоторой изобретенной временной переменной т
Это означает, что выражение не может быть неявно преобразовано в void
, поскольку void t=e
является незаконным для всех выражений e
. Это даже верно, если e
является выражением типа void
, например void(3)
.
Таким образом, выражение типа void
не может быть неявно преобразовано в void
.
Это приводит нас к:
20.9.2/2 Требования [func.require]
Define ВЫЗОВ (f, t1, t2,..., tN, R) в виде ВЫЗОВ (f, t1, t2,..., tN) неявно преобразованный в р.
Короче говоря, INVOKE(f, t1, t2, ..., tN, R)
никогда не действует, если R
равно void
, поскольку ничто (включая void
) не может быть неявно преобразовано в void
.
В результате этого все std::function<void(Args...)>
имеют свойство !*this
и поэтому не могут быть вызваны как единственные конструкторы, не имеющие !*this
в качестве постусловия (или не копировать такое состояние из другого function
того же типа) требуют Callable
одного из параметров.
20.9.11.2/7 Шаблон класса функция [Func.wrap.func]
Требуется: F должен быть CopyConstructible, е должны быть Подтверждаемыми ( 20.9.11.2 ) для типов аргументов ArgTypes и тип возврата р, Конструктор копирования и деструктор не должны исключать исключения.
20.9.11.2/2 Шаблон класса функция [Func.wrap.func]
Вызываемый объект е типа F является подлежащий выкупу для типов аргументов ArgTypes и тип возврата р если выражение Sion ВЫЗОВ (f, declval()..., R), рассматриваемый как неоцениваемый операнд (пункт 5), хорошо сформированный ( 20.9.2).
Как показано выше, для std::function<void(Args...)>
нет выражений Callable
.
Если каким-то образом найденный std::function<void(Args...)>
, где был найден, вызывается operator()
:
вызов [func.wrap.func.inv]
Эффекты: ВЫЗОВ (f, std:: forward (args)..., R) ( 20.9.2), где е является целевым ject ( 20.9.1 ) *это.
как INVOKE(f, std::forward<ArgTypes>(args)..., void)
плохо сформирован для всех аргументов и f
.
Является ли эта линия рассуждения звуком?