Переосмыслить приведение в C – невозможно принять адрес rvalueC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Переосмыслить приведение в C – невозможно принять адрес rvalue

Сообщение Anonymous »

У меня есть две структуры struct Temp и struct MyTemp с одинаковым расположением памяти, и я хочу привести возвращаемое значение типа struct Temp к типу struct MyTemp .
Например, в C++ я могу достичь этой цели в одной строке (без какой-либо временной переменной) следующим образом:

Код: Выделить всё

#include 

struct Temp {
int a;
int b;
};

struct MyTemp {
int a;
int b;
};

struct Temp get_temp(int a, int b) {
struct Temp temp = {
.a = a,
.b = b,
};
return temp;
}

int main() {
struct MyTemp mt = reinterpret_cast(std::move(get_temp(1, 2)));
}
Однако я не могу найти эквивалент на C, например, следующий код на C не компилируется:

Код: Выделить всё

struct Temp {
int a;
int b;
};

struct MyTemp {
int a;
int b;
};

struct Temp get_temp(int a, int b) {
struct Temp temp = {
.a = a,
.b = b,
};
return temp;
}

int main() {
struct MyTemp mt = *(struct MyTemp *)&get_temp(1, 2);
// error: cannot take the address of an rvalue of type 'struct Temp'
}
Итак, мой вопрос: есть ли способ сделать на C то же самое, что я сделал на C++? Если нет, то почему? И почему std::move может обойти эту проблему?


Подробнее здесь: https://stackoverflow.com/questions/790 ... -an-rvalue
Ответить

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

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

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

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

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