2016-09-16 13 views
0

このコードに問題はありますか? 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

+1

コンパイラで控除された引数は、C++ 14の機能です。 GCCバージョン6は、完全なC++ 14の実装(および今後のC++ 17標準の大部分)を備えています。 VC++ 2015(通常通り)は遅れており、完全なC++ 14標準が実装されていません。 –

+0

そうですね。しかし、ここでhttp://en.cppreference.com/w/cpp/compiler_supportは、一般的なラムダはmsvc14でサポートされていると述べています。 – ellipsis

+1

VC++はジェネリックlambdaをサポートしていますが、もう少し(特にあなたが持っているエラーメッセージ)ラムダは問題ですが、 'make_cond_functor'関数への引数の型減算です。これはGCCの拡張機能のようです。それはコンセプト提案の一部であるようですが、それはまだどの基準にも達していません。 –

答えて

1

MSVCは、この場合は(驚く)の故障ではありません。 問題は、この関数の署名が無効である機能make_cond_functor

auto make_cond_functor(auto && cond, auto && true_f, auto && false_f) 
//     /\   /\    /\ 
//     NOT  VALID  C++  SYNTAX 

です。現在のC++では、関数の引数にautoを使用できる唯一のケースは汎用ラムダです。これは、GCC 4.9.0で導入されたGCC拡張機能のようです。

+0

実際には、C++のための[提案されている](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4040.pdf)17。 – paulotorrens

+0

うん。 make_cond_functorは省略された関数です。そしてそれはC++でさえありません17。 http://en.cppreference.com/w/cpp/language/functionを参照してください:http://stackoverflow.com/questions/34918814/abbreviated-function-template-vs-function-template-with-forwarding-reference -pa – ellipsis

+1

@PauloTorrens for C++ 20、私が知っている限り、C++ 17はファイナライズされ、自動パラメータは追加されませんでした。 – Yakk

関連する問題