Por que não há aviso gcc / g ++ para temporários não utilizados?
Considere o seguinte código:
void ListenerImpl::attach(boost::shared_ptr<ISubscriber> subscriber)
{
boost::unique_lock<boost::mutex>(mtx);
subscribers.push_back(subscriber);
}
void ListenerImpl::notify(MsgPtr msg)
{
boost::unique_lock<boost::mutex>(mtx);
//notify all subscribers
BOOST_FOREACH(boost::shared_ptr<ISubscriber> subscriber, subscribers){
subscriber->update(msg);
}
}
(Esta é uma implementação de um padrão de observador, conforme descrito no GoF.) A intervenção do usuário aqui foi para proteger o attach () e o notify () da execução simultânea, daí o boost :: unique_lock. O objetivo era proteger osubscribers
container.
Mas é realmente extremamente difícil perceber que os bloqueios são de fato apenas temporários (observe mais de perto, não há nomes atribuídos a eles). Portanto, o bloqueio no mutex será liberado imediatamente, quando o temporário for destruído, ou seja, o código não é seguro para threads. Eu esperaria em situações como esta um aviso do compilador. Algo como "Temporário não utilizado".
Pior ainda, o cppcheck também não reconheceria esse erro. (cppcheck: uma ferramenta de análise de código c / c ++http: //sourceforge.net/apps/mediawiki/cppcheck/index.php? title = Main_Page)
@Gcc emite avisos sobre variáveis não utilizadas. O temporário aqui é uma variável não utilizada e, definitivamente, o resultado da desatenção do programador. Então, por que não há avisos em casos como este? Talvez seja muito complicado descobrir essas situações?