я использую std::function()
в моем коде с C ++ 11 и VS2010. Вот мой код
function<string (string)> myfunc = 3;
myfunc(string());
Очевидно, что код неверный, для myfunc
объект не инициализирован должным образом. myfunc
объект должен оцениваться function<string (string)>
объект, отличный от целочисленного типа. И при запуске к коду myfunc(string());
, std::function
объект бросает bad_function_call()
и получает ошибку.
Однако, что смутило меня, почему C ++ 11 не проверяет тип во время компиляции? Это так странно, потому что отсутствие проверки типа сделает программистов легко запутать код случайно, пока не будет запущена соответствующая строка ошибки.
Поэтому я хочу спросить: std::function()
проверить тип при компиляции кода в C ++ 11 в VS2010? Если нет, есть ли решение этой проблемы?
Похоже, это хак в реализации MS std::function
чтобы разрешить следующее:
function<string (string)> myfunc = NULL;
Это кусок кода, который я мог найти в реализации MS <functional>
заголовок:
#if defined(_NATIVE_NULLPTR_SUPPORTED) \
&& !defined(_DO_NOT_USE_NULLPTR_IN_STL)
function(int)
{ // construct empty function wrapper from null pointer
this->_Reset();
}
#endif /* defined(_NATIVE_NULLPTR_SUPPORTED) etc. */
Таким образом, похоже, что этот конструктор включен условно в зависимости от уровня стандартного соответствия, который хочет пользователь.
Однако в спецификации стандартной библиотеки C ++ 11 такого конструктора нет (см. Пункт 20.8.11.2.1).
Других решений пока нет …