我正在使用 TR1std::function
来实现一个简单的回调机制。如果我不想被回调,我注册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> with 1>
[ 1> _Result_type=void, 1> _Ret=void, 1>
_BindN=std::tr1::_Bind2,Foo *,std::tr1::_Ph<1>> 1> ] 1> 没有构造函数可以采用源类型,或者构造函数重载决议不明确
这是编译器的限制,还是我在做一些愚蠢的事情?我知道在这种特殊情况下,我可能不会从使用三元运算符中获得任何好处,但我只是好奇。