Идентификаторы структурированного связывания инициализируются по порядку?
Это было трудно вывести из предложения.
Будут ли структурированные привязки 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
Порядок инициализации определен.