2016-09-03 5 views
4

私は、次のコードをコンパイルするVS 2015(更新3)を使用します。VC++はなぜclangがコードをコンパイルしないのですか?

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

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

私はそれをコンパイルするVC++を使用している場合、それは大丈夫です。私は、Visual StudioでVisual Studio 2015 - Clang with Microsoft CodeGen (v140_clang_c2)にコンパイラを変更する場合は、打ち鳴らすには、エラーを報告し、次のように私は最初の行をコメントしている場合

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

std::function fn = std::isspace;

さらに驚くべき、打ち鳴らすもOKになります。

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

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

根本原因は何ですか。

答えて

6

std::isspaceは、標準ライブラリでオーバーロードされています。

標準ライブラリヘッダーの構造上、1つのコンパイラは2つの異なる宣言名を参照しています。

引数またはキャストなしでの使用はあいまいです。

4

std::isspaceは、Cとの互換性のためである<cctype>で見出さfunction、又は<locale>に見出さfunction templateを参照するか、曖昧です。

技術的にグローバル名前空間にC関数をインポートする実装のための要件はありませんが、あなたは、

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

またはstd::名前空間を省略してあいまいさを解決することができます。

<codecvt>のClangとGCCの実装には、両方とも<locale>のテンプレートの宣言が含まれているように見えます。おそらくVSはそうしない。

関連する問題