«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Можете ли вы назначить RVALUE типа класса в C ++?

Можете ли вы назначить RVALUE типа класса в C ++?

Опубликовано в 2025-03-24
Просматривать:118

 Can You Assign to an Rvalue of Class Type in C  ?

присвоение типу класса rvalues ​​

Обзор

в языке программирования C, rvalues ​​(правые значения) обычно нельзя использовать как lvalues ​​(левые значения). Однако существуют исключения из этого правила, как показано следующим кодом:

]
class Y {
public:
    explicit Y(size_t num = 0) {}
};

int main() {
    Y(1) = Y(0); // WHAT?!?
    return 0;
}

удивительно, что этот код успешно компилируется, хотя объект, возвращаемый конструктором y (1), является RValue. В этой статье исследуются причины этого неожиданного поведения.

присвоение к классу типа rvalues ​​

] Ключ к пониманию, почему этот код действителен в концепции синтезированных функций членов. Для классов, которые явно не определяют оператора назначения, компилятор генерирует оператора назначения по умолчанию. Этот оператор по умолчанию является функцией-членом, которая принимает ссылку на объект того же класса, что и его параметр.

в примере выше, оператор назначения для класса Y синтезируется следующим образом:

Y& Y::operator=(const Y& other);

конструктор возвращающих значений

, когда объект создается с использованием конструктора, который возвращает rvalue, компилятор генерирует временный объект в памяти. Этот временный объект автоматически разрушается в конце утверждения, в котором он был создан. Однако в случае, когда конструктор возвращает RVALUE типа класса, оператор синтезированного назначения может расширить время жизни временного объекта.

синтаксис назначения

Оператор назначения y (1) = y (0); является синтаксическим сахаром для следующего кода:

y (1) .Orator = (y (0));
Y(1).operator=(Y(0));

вывод

противоречит тому, что обычно ожидается, можно присвоить rvalue из типа класса в C, потому что компилятор синтезирует неконтет-назначение для операторов, не определяющих назначение. Эти синтезированные операторы назначения расширяют время жизни временных объектов, созданных конструкторами, позволяя назначениям RVALUE.

]
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3