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

Это было трудно вывести из предложение.
Будут ли структурированные привязки 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();
}

4

Решение

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

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

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

3

Другие решения

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

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

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

1

По вопросам рекламы [email protected]