Я столкнулся со странным поведением в VS2012 с std :: function, о котором я ничего не мог найти в Интернете.
Учитывая следующий пример программы:
#include <functional>
#include <iostream>
typedef std::function< int()> fntype;
void foo(const fntype& fn)
{
try
{
if(fn)
fn();
else
std::cout << "fn is empty" << std::endl;
}
catch(const std::bad_function_call&)
{
std::cout << "fn threw anyways" << std::endl;
}
}
int main(int argc, char **argv)
{
// OK
std::function<int()> nothing;
foo(nothing);
// Fails
std::function<const int()> nothing2;
foo(nothing2);
return 0;
}
Второй вызов foo () компилируется (даже если константа возвращаемого типа не совпадает с fntype. Однако if (fn) принимает значение true тем не менее.
Результат:
fn пуста
fn все равно бросил
Примечание. В отладчике fn отображается как пустая в обоих случаях.
Такое поведение невозможно воспроизвести с помощью GCC (Coliru). Здесь получается ожидаемый результат:
Результат:
fn пуста
fn пуста
Это проблема в реализации стандартной библиотеки VS2012?
Есть ли способ обойти эту проблему: a) получить значение false для fntype :: operator bool () в случае 2 или b) привести к сбою компиляции из-за несоответствия подписи.