このコードに問題はありますか? Visual Studioの2015(msvc140)でmsvc140で一般的なラムダ
#include <iostream>
#include <string>
#include <type_traits>
bool condition_func(int x)
{
return x > 0;
}
std::string true_branch_func(int x)
{
return "true_branch_func(int x), x = " + std::to_string(x);
}
std::string false_branch_func(int x)
{
return "false_branch_func(int x), x = " + std::to_string(x);
}
// template<typename C, typename T, typename F>
auto make_cond_functor(auto && cond, auto && true_f, auto && false_f)
{
return [&](auto &&... args)
{
return cond(args...) ? true_f(args...) : false_f(args...);
};
}
int main()
{
std::cout << make_cond_functor(condition_func, true_branch_func, false_branch_func)(-3) << std::endl;
return 0;
}
私は問題を抱えている:
エラーC3533:「make_cond_functor :: make_cond_functor:パラメータが '自動'
エラーC2664を含む型を持つことができません(& &をint型、& &をint型、& &をint型) ':引数から1を変換することはできません 'int型&' から' ブール値(__cdecl *)(int型)"
ノート:理由:から変換できません『int型
ノート』から「オーバーロードされた機能:この変換が可能な何のコンテキストがありません
しかし、G ++ - 6.2がこれをコンパイルコードは完全にうまくいく。 make_cond_functorは、C++で許可された汎用ラムダを返します。だから、このコードは正しいはずですね。そして、コードではなく、msvc140に問題があります。 cppreferenceで
ジェネリックラムダ:enter link description here
コンパイラで控除された引数は、C++ 14の機能です。 GCCバージョン6は、完全なC++ 14の実装(および今後のC++ 17標準の大部分)を備えています。 VC++ 2015(通常通り)は遅れており、完全なC++ 14標準が実装されていません。 –
そうですね。しかし、ここでhttp://en.cppreference.com/w/cpp/compiler_supportは、一般的なラムダはmsvc14でサポートされていると述べています。 – ellipsis
VC++はジェネリックlambdaをサポートしていますが、もう少し(特にあなたが持っているエラーメッセージ)ラムダは問題ですが、 'make_cond_functor'関数への引数の型減算です。これはGCCの拡張機能のようです。それはコンセプト提案の一部であるようですが、それはまだどの基準にも達していません。 –