Я думаю, что tr1 решает эту проблему. N1836 (последняя версия tr1) говорит:
Функциональный объект f типа F может вызываться для типов аргументов T1, T2, ..., TN и типа возврата R, если при заданных значениях t1, t2, ..., tNoftypesT1, T2, ..., TN, соответственно, INVOKE (f, t1, t2, ..., tN) хорошо сформирован ([3.3]) и,если R не является пустым, можно преобразовать в R.
В вашем примере R является недействительным, и поэтому последняя часть требований для Callable
(конвертируется в R) игнорируется.
Однако похоже, что C ++ 0x (C ++ 11) меняет правила.В C ++ 11 Callable
определяется как INVOKE(f, t1, t2, ..., tN, R)
, который определен в [func.require] как требование, чтобы INVOKE(f, t1, t2, ..., tN)
был неявно конвертируемым в R, за исключением случаев, когда R является недействительным.Таким образом, в C ++ 11 ваш пример должен потерпеть неудачу.