Почему лямбда в статическом инициализаторе не может получить доступ к закрытым членам класса в VC ++ 2013?
Рассмотрим следующий фрагмент кода:
#include <iostream>
class foo {
int var = 99;
public:
static int const i;
};
int const foo::i = [&] { return foo().var; }();
auto main() -> int {
std::cout << foo::i << std::endl;
return 0;
}
Учитывая стандарт§ 9.4.2 / 2 Статические данные-члены [class.static.data]:
Выражение инициализатора в определенииstatic
член данных находится в области своего класса.
а также
§ 5.1.2 / 2 & 3 Лямбда-выражения [expr.prim.lambda]:
2
Оценка лямбда-выражения приводит к временному значению prvalue (12.2). Этот временный объект называется объектом закрытия. Лямбда-выражение не должно появляться в неоцененном операнде (пункт 5). [Примечание: закрывающий объект ведет себя как функциональный объект (20.9). - примечание]
3
Тип лямбда-выражения (который также является типом объекта замыкания) является уникальным, безымянным типом класса несоединения, называемым типом замыкания, свойства которого описаны ниже. Этот тип класса не является совокупным (8.5.1). Тип замыкания объявляется в наименьшей области блока, области класса или области пространства имен, которая содержит соответствующее лямбда-выражение.
Мы заканчиваем тем, что лямбда в выражении:
int const foo::i = [&] { return foo().var; }();
может по праву получить доступprivate
Членыclass foo
так как он объявлен и определен в выражении инициализатораstatic
членi
изclass foo
и как таковая его сфера является сферойclass foo
.
Код компилируется и отлично работает вGCC v4.8 а такжеClang v3.4., однако не удается скомпилировать в VC ++ 2013, что приводит к ошибке компилятора:
ошибка C2248: 'foo :: var': невозможно получить доступ к закрытому члену, объявленному в классе 'foo'
Вопрос:
Является ли описанное выше поведение VC ++ 2013 ошибкой или это связано с определенным поведением VC ++ 2013, которое может быть изменено путем изменения определенных настроек компилятора?