По-видимому, назначенные инициализаторы не являются «правильным» C++. Есть ли альтернативы этому?
Мне нравится использовать это для структур, потому что:
Спасибо Jelle
Инициализаторы, назначенные IINM, проголосовали за C++ 20, так что это будет облегчением.
^ - И они уже поддерживаются как расширение как минимум двумя популярными компиляторами.
Полезное обсуждение по теме stackoverflow.com/questions/18731707/…
@StoryTeller, ты знаешь, какой именно компилятор? На Mac компилятор xcode по умолчанию поддерживает его, но мы хотим, чтобы он работал и для Visual Studio.
@JelleBakker - Я имел в виду GCC и Clang. Но это потому, что они также поддерживают C99. В этом отношении MSVC отстает.





Дано
struct S {
int x, y, z;
}:
S s {
.y = 1; // not standard until C++20
};
Are there any alternatives for this?
Вы можете использовать инициализацию позиционного списка:
S s{0, 1};
У него есть недостаток (возможно, преимущество, в зависимости от ситуации) в том, что имена членов не являются явными, что означает, что они зависят от порядка членов, и все члены, предшествующие последнему явно инициализированному, также должны присутствовать.
Другой вариант: назначить участника позже.
S s{};
s.y = 1;
У этого есть недостаток, заключающийся в том, что его нельзя использовать для инициализации константных членов. Другой недостаток заключается в том, что это не одно выражение инициализации. Это можно обойти, используя функцию:
S init(int y) {
S s{};
s.y = y;
return s;
}
S s = init(1);
Еще одна альтернатива: используйте конструктор.
struct S {
int x = 0, y = 0, z = 0;
S(int y): y(y) {}
};
В некоторых случаях это может быть намного проще, но в других - совсем неясно (например, в этом векторном случае). Еще один недостаток - отсутствие тривиального конструктора.
В чем вопрос? Также они идут, en.cppreference.com/w/cpp/language/…