2016-09-03 2 views
4

Я использую VS 2015 (Update 3) скомпилировать следующий код:Почему VC++ компилирует код, пока clang его нет?

#include <codecvt> 
#include <cctype> 
#include <functional> 

int main() 
{ 
    std::function<int(int)> fn = std::isspace; 
} 

Если я использую VC++, чтобы скомпилировать его, это нормально. Однако, если изменить компилятор Visual Studio 2015 - Clang with Microsoft CodeGen (v140_clang_c2) в Visual Studio, лязг сообщает об ошибке:

main.cpp(7,26): error : no viable conversion from '' to 'std::function'

std::function fn = std::isspace;

более удивительно, если комментарии первую строку следующим образом, лязг также будет хорошо.

//#include <codecvt> // now clang feels happy 
#include <cctype> 
#include <functional> 

int main() 
{ 
    std::function<int(int)> fn = std::isspace; 
} 

В чем причина?

ответ

6

std::isspace перегружен в стандартной библиотеке.

Из-за структуры их стандартных заголовков библиотеки один компилятор видит два разных объявления имени.

Тогда его использование без аргументов или литья неоднозначно.

4

std::isspace неоднозначен, она может либо обратиться к function найденным в <cctype>, который предназначен для обеспечения совместимости с C, или function template найденных в <locale>.

Вы можете разрешить неоднозначность с

std::function<int(int)> fn = static_cast<int(*)(int)>(std::isspace); 

Или, опуская std:: имен, хотя технически нет никаких требований для реализации, чтобы импортировать функции C в глобальное пространство имен.

В реализациях Clang и GCC <codecvt> оба, как представляется, включают объявления шаблона от <locale>, следовательно, ошибка; предположительно, VS нет.

Смежные вопросы