Я использую std::function
TR1 для реализации простого механизма обратного вызова. Если я не хочу, чтобы мне перезвонили, я регистрирую nullptr
в качестве обработчика обратного вызова. Это компилируется и работает нормально:
void Foo::MessageHandlingEnabled( bool enable ){
if( enable )
m_Bar.RegisterMessageHandler( std::bind(&Foo::BarMessageHandler, this, std::placeholders::_1) );
else
m_Bar.RegisterMessageHandler( nullptr );
}
Если я перепишу это с помощью тернарного оператора...
void Foo::MessageHandlingEnabled( bool enable ){
m_Bar.RegisterMessageHandler( enable?
std::bind(&Foo::BarMessageHandler, this, std::placeholders::_1) :
nullptr );
}
... Компилятор VC++ говорит:
ошибка C2446: ':': нет преобразования из 'nullptr' в 'std::tr1::_Bind‹_Result_type,_Ret,_BindN>' 1> с 1>
[ 1> _Result_type=void, 1> _Ret=void , 1>
_BindN=std::tr1::_Bind2,Foo *,std::tr1::_Ph‹1>> 1> ] 1> Ни один конструктор не мог принять исходный тип, или разрешение перегрузки конструктора было неоднозначным
Это ограничение компилятора или я что-то туплю? Я знаю, что в данном конкретном случае я не получу никакой выгоды от использования тернарного оператора, но мне просто любопытно.