Почему лямбда в статическом инициализаторе не может получить доступ к закрытым членам класса в 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, которое может быть изменено путем изменения определенных настроек компилятора?

Ответы на вопрос(0)

Ваш ответ на вопрос