Я уж думал, что исчерпал тему багов, относящихся к лямбда-выражениям, но оказалось, что мои предположения были не верны.
Так что представляю на обозрение еще один баг в лямбда-выражениях компилятора
MS VC++ 2010.
Этот баг связан с невозможностью совмещения спецификатора класса памяти
static с ключевым словом
typename, когда используется зависящий от шаблона тип данного.
Вот пример, демонстрирующий сказанное:
#include "stdafx.h"
#include <iterator>
template <typename Iterator>
void f( Iterator )
{
static typename std::iterator_traits<Iterator>::difference_type n;
}
template <typename Iterator>
void f1( Iterator )
{
auto lm = []()
{
static typename std::iterator_traits<Iterator>::difference_type n;
};
}
int _tmain(int argc, _TCHAR* argv[])
{
{
int *p = 0;
f( p );
f1( p );
}
return 0;
}
При компиляции этого кода компилятор
MS VC++ 2010 выдает следующее сообщение об ошибке:
цитата: |
error C2899: использование typename вне объявления шаблона не допускается |
|
Это сообщение об ошибке относится к предложению в лямбда-выражении функции
f1 Точно такое же предложение в функции
f, где нет лямбда-выражения компилируется без проблем.