g ++ принимает следующее, а VC ++ - нет:
[&z]{ z = 1; }();
Здесь z
фиксируется, поэтому g ++ не жалуется на неопределенную ссылку . Тем не менее:
5.1.2 / 10:
Идентификаторы в списке захвата ищутся с использованием обычных правил для поиска безоговорочного имени (3.4.1); каждый такой поиск найдет
переменная с автоматической продолжительностью хранения, объявленной в достижении
область действия локального лямбда-выражения.
z
- это , а не автоматическое хранение. Поэтому z
не может быть захвачено. Поэтому поведение g ++ некорректно, а VC ++ корректен.
В вашем коде VC ++ принимает, а g ++ нет:
[]{ z = 1; }();
z
доступен VC ++ как статическое хранилище, которое разрешено в лямбда-теле. g ++, по-видимому, не разрешает имя z
в статической переменной, объявленной выше, и поэтому выдает неопределенную ссылку , в то время как это не должно.
ТЛ; др
Это, вероятно, ошибка в g ++
Edit:
Это действительно ошибка , исправленная в 4.7.