Идентификаторы структурированного связывания инициализируются по порядку?

Это было трудно вывести из предложения.
Будут ли структурированные привязки C++17 инициализировать свои идентификаторы слева направо?

Гарантируется ли это печать "сначала", "второй", затем "третий"?

#include <iostream>

struct A{ A(){std::cout << "first\n";  } };
struct B{ B(){std::cout << "second\n"; } };
struct C{ C(){std::cout << "third\n";  } };

struct D{
  A first;
  B second;
  C third;
};

auto f(){
  return D{};
}

int main (){
  auto [a,b,c] = f();
}

2 ответа

Структурированная привязка не копирует значения; это ссылается на них. В вашем примере a не является копией первого члена возвращаемого значения; это ссылка на это. Поскольку вы инициализируете ссылки вместо значений, порядок инициализации не может быть обнаружен путем просмотра порядка вызовов конструктора.

Для структуры с открытыми членами порядок получения этих ссылок не имеет значения, поскольку вы не можете вмешиваться в этот процесс. Для определенной пользователем структуры, которая реализует методы, которые использует структурированное связывание, это другая история.

Однако в настоящее время окончательная редакция стандартов, которая была утверждена на компакт-диске C++17, нам недоступна. Таким образом, невозможно узнать, в каком порядке будут вызываться такие интерфейсные функции, или определяет ли он порядок вообще.

Гарантируется печать "первый", "второй", затем "третий", но не Structured bindingsвместо этого конструктором struct D,

Призыв к f() построит экземпляр struct D, а также Dбудет вызван конструктор, а объекты в D будет инициализирован в порядке объявления, что означает A, B, C будет инициализирован с порядком, и будет напечатано "первое", "второе", "третье".

Но я не уверен, как Structured bindingsПорядок инициализации определен.

Другие вопросы по тегам