Неявное преобразование из int в Union Works в назначенном инициализаторе, но в противном случае не может компилироватьC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Неявное преобразование из int в Union Works в назначенном инициализаторе, но в противном случае не может компилировать

Сообщение Anonymous »

У меня есть программа, которая отображает регистрации устройств в союзах битфилд и целых числа. Это часть более крупной кодовой базы, поэтому, хотя это очень код C-стиля, мы компилируем его как C ++ 20. Вот надуманный пример, который соответствует тому, что у нас было.#include

typedef union {
uint16_t reg;
struct {
uint16_t x : 4;
uint16_t y : 4;
uint16_t z : 4;
};
} PositionReg;

typedef union {
uint16_t reg;
struct {
uint16_t yaw : 4;
uint16_t pitch : 4;
uint16_t roll : 4;
};
} AttitudeReg;

typedef struct {
PositionReg xyz;
AttitudeReg ypr;
} Frame;

uint16_t get_position() {
return 0xDEAD;
}

uint16_t get_attitude() {
return 0xBEEF;
}

// This compiles
Frame get_frame() {
Frame f = {
.xyz = get_position(),
.ypr = get_attitude(),
};

return f;
}

// This won't compile
Frame get_frame_broken() {
PositionReg xyz = get_position();
AttitudeReg ypr = get_attitude();

Frame f;
f.xyz = xyz;
f.ypr = ypr;

return f;
}

Я не понимаю, почему она сломалась, когда я добавил функцию get_frame_brken . Компилятор не имел проблемы неявно преобразовать UINT16_T в PositionReg внутри назначенного инициализатора, но когда я пытаюсь сделать это за пределами назначенного инициализатора, он не может компилировать со следующей ошибкой (ссылка Godbolt)
: In function 'Frame get_frame_broken()':
:46:35: error: conversion from 'uint16_t' {aka 'short unsigned int'} to non-scalar type 'PositionReg' requested
46 | PositionReg xyz = get_position();
| ~~~~~~~~~~~~^~
:47:35: error: conversion from 'uint16_t' {aka 'short unsigned int'} to non-scalar type 'AttitudeReg' requested
47 | AttitudeReg ypr = get_attitude();
| ~~~~~~~~~~~~^~
Compiler returned: 1
< /code>
Почему это вызывает ошибку? Или я застрял, разделяя его на две строки, такие как это: < /p>
// This compiles
Frame get_frame_broken() {
// PositionReg xyz = get_position();
// AttitudeReg ypr = get_attitude();
PositionReg xyz;
AttitudeReg ypr;
xyz.reg = get_position();
ypr.reg = get_attitude();

Frame f;
f.xyz = xyz;
f.ypr = ypr;

return f;
}


Подробнее здесь: https://stackoverflow.com/questions/796 ... but-otherw
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»