Это было трудно вывести из предложение.
Будут ли структурированные привязки 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();
}
Структурное связывание не копия ценности; Это Рекомендации их. В вашем примере a
не является копией первого члена возвращаемого значения; это ссылка на это. Поскольку вы инициализируете ссылки вместо значений, порядок инициализации не может быть обнаружен путем просмотра порядка вызовов конструктора.
Для структуры с открытыми членами порядок получения этих ссылок не имеет значения, поскольку вы не можете вмешиваться в этот процесс. Для определенной пользователем структуры, которая реализует методы, которые использует структурированное связывание, это другая история.
Однако в настоящее время окончательная редакция стандартов, которая была утверждена на компакт-диске C ++ 17, нам недоступна. Таким образом, невозможно узнать, в каком порядке будут вызываться такие интерфейсные функции, или определяет ли он порядок вообще.
Гарантируется печать «первый», «второй», затем «третий», но не Structured bindings
вместо этого конструктором struct D
,
Призыв к f()
построит экземпляр struct D
, а также D
будет вызван конструктор, а объекты в D
будет инициализирован в порядке объявления, что означает A
, B
, C
будет инициализирован с порядком, и будет напечатано «первое», «второе», «третье».
Но я не уверен, как Structured bindings
Порядок инициализации определен.