Синтаксическая ошибка в классе шаблона с лямбда-выражением - PullRequest
5 голосов
/ 19 октября 2011

У меня есть следующий упрощенный сценарий:

template< typename T>
struct A
{
  A() : action_( [&]( const T& t) { })
  {}

private:
   boost::function< void( const T& )> action_;
};

При компиляции с Visual C ++ 2010 выдает синтаксическую ошибку при построении действия _:

1>test.cpp(16): error C2059: syntax error : ')'
1>          test.cpp(23) : see reference to class template instantiation A<T>' being compiled

Что странно, тот же пример, без параметра шаблона, компилируется просто отлично:

struct A
{
  A() : action_( [&]( const int& t) { })
  {}

private:
  boost::function< void( const int& )> action_;
};

Я знаю, что одним из способов решения этой проблемы является перемещение инициализации action_ в теле конструктора вместо списка инициализации, как показано в коде ниже:

template< typename T>
struct A
{
  A()
  {
    action_ = [&]( const T& t) { };
  }

private:
  boost::function< void( const T& )> action_;
};

... но я хочу избежать такого обходного пути.

Кто-нибудь сталкивался с такой ситуацией? Есть ли объяснение / решение этой так называемой синтаксической ошибки?

1 Ответ

1 голос
/ 19 октября 2011

Сломана реализация лямбд в Visual C ++ 2010?Это мое лучшее предположение для объяснения.

Хотя, я заинтригован, что захват переменных области видимости по ссылке делает в этой ситуации ... Ничего?

...