Проверяет ли std::function() тип при компиляции кода в C++11 в VS2010?

Я использую 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? Если нет, есть ли решение этой проблемы?

1 ответ

Решение

Похоже, это хак в реализации 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).

Другие вопросы по тегам