ОК, стандарт по-прежнему говорит о том, что инициализация объединения в виде скобок инициализирует только первый элемент. Полагаю, это ставит этот вопрос больше в «Не было бы хорошо, если бы ...?» категория.Сделать инициализатор C++ автоматически определять член профсоюза?
Должно быть, это так? В конце концов, теперь у нас есть автоматическое определение типа для других типов.
auto x = 3; // int
auto s = "foo"; // char *
auto w = L"Foo"; // wchar_t *
Так почему бы и нет с профсоюзом? Дано:
struct init
{
int t;
union {
long long x;
char *s;
wchar_t *w;
};
};
В настоящее время вы можете только скобки инициализации init::x
(с int
), не s
или w
.
Автоматическое определение типа может быть расширен таким образом, чтобы член профсоюза инициализируется выбирается на основе типа инициализатора: (. Конечно, это не должно составить в текущем стандарте)
auto init initial_data [] = {
{ 0, 3 }, // initializes x, brace elision
{ 1, "foo" }, // initializes s
{ 2, L"Foo" } // initializes w
};
Это позволит разместить все initial_data
в одном списке инициализаторов. (Я подозреваю, что ключевое слово auto должно было бы отправиться куда-то еще).
Есть ли что-то, что делает это плохой идеей (за исключением «никто не думает об этом еще» или «это слишком сложно реализовать»)? В настоящее время вы должны сделать что-то чудовищное, как:
#define RI(X) reinterpret_cast<long long>(X)
const init initial_data[] = {
{ 0, 3 }, // initializes x, brace elision
{ 1, RI("foo") }, // initializes s
{ 2, RI(L"Foo") } // initializes w
};
Я не хотел бы пройти через эти искривления, за исключением того, что std::exception
должен быть инициализирован с std::string
(т.е. на основе char
), так что я не могу просто имеют список инициализаций со всеми wchar_t*
. И мне бы очень хотелось, чтобы все эти инициализаторы находились там же.
'повышение :: variant' имеет такое поведение (по большому счету, остерегайтесь неоднозначных конструктора перегрузок между типами элементов варианта) – sehe