2016-10-31 6 views
11

バリアブルテンプレートのコンストラクタでラムダを使用すると、Microsoft Visual C++ 2013(12.0)を使用してコンパイル時エラーが発生します。私は下に示すようにそれを煮詰めることができました(errorコメントの行を見てください)。 14.0には存在しない12.0のバグのようです。私は他のバージョンを試していません。このバグに関する文書はありますか?おそらくリリースノートの形で、このバグが発生する条件とそれが明示的に修正されたことを明確にしていますか? (CppCoreGuidelinesに従って)可変テンプレートのラムダ

今日のよう
#include <functional> 

// a simple method that can take a lambda 
void MyFunction(const std::function<void()>& f) {} 

// a simple class that can take a lambda 
class MyClass 
{ 
public: 
    MyClass(const std::function<void()>& f) {} 
}; 

// non-templated test 
void test1() 
{ 
    MyFunction([] {}); // OK 
    MyClass([] {}); // OK 
    MyClass o([] {}); // OK 
} 

// non-variadic template test 
template<typename T> 
void test2() 
{ 
    MyFunction([] {}); // OK 
    MyClass([] {}); // OK 
    MyClass o([] {}); // OK 
} 

// variadic template test 
template<typename... T> 
void test3() 
{ 
    MyFunction([] {}); // OK 
    MyClass([] {}); // OK 
    MyClass a([] {}); // error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
         // error C2440: 'initializing' : cannot convert from 'test3::<lambda_12595f14a5437138aca1906ad0f32cb0>' to 'int' 

    MyClass b(([] {})); // putting the lambda in an extra() seems to fix the problem 
} 

// a function using the templates above must be present 
int main() 
{ 
    test1(); 
    test2<int>(); 
    test3<int, int, int>(); 
    return 1; 
} 
+2

'#include 'を追加してコンパイルしました。私はMicrosoft Visual Studio Community 2015を使用しました バージョン14.0.25431.01アップデート3 – wally

+0

奇妙です。自分のコードに '#include 'があります(コピー貼り付けに忘れてしまった)が、それでも私にとっては不平を言う。 –

+1

gcc&clangはコードを受け入れます([Demo](http://coliru.stacked-crooked.com/a/86fa0b4c990af350))。私はmsvcのバグと言うでしょう(あなたのテンプレートとバリデーショナルなテンプレートテストでさえさらに)。 – Jarod42

答えて

-1

は、{}括弧のイニシャライザを使用する必要があります。それを試しましたか?

MyClass a{[] {}}; 
関連する問題