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

Можете ли вы назначить ссылки Rvalue типа класса? Объяснение парадокса.

Опубликовано 8 ноября 2024 г.
Просматривать:515

 Can You Assign to Rvalue References of Class Type?  A Paradox Explained.

Присвоение Rvalue ссылкам типа класса: разрешенный парадокс

В области C различие между lvalue и rvalues ​​имеет первостепенное значение. Lvalues ​​представляют объекты с ячейками памяти, которые можно изменить, тогда как rvalues ​​воплощают временные объекты или константы, которые не могут быть изменены. Однако интригующий фрагмент кода поднимает вопросы об этом фундаментальном разделении:

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

int main() {
    Y(1) = Y(0); // Here lies the enigma!
    return 0;
}

Почему этот код компилируется? Разве значение r, возвращаемое конструктором, не является эфемерным и, следовательно, непригодным для присваивания?

Ключ к пониманию этого парадокса лежит в неявном операторе присваивания в C. Если оператор присваивания не определен явно для класса, компилятор синтезирует оператор присваивания по умолчанию. Важно отметить, что в некоторых случаях этот синтезированный оператор может быть применим к значениям r.

Именно здесь явное ключевое слово играет роль. В данном примере класс Y не объявляет оператор присваивания, поэтому компилятор генерирует его. Ключевое слово явный предотвращает неявные преобразования из rvalue, но не препятствует применимости синтезированного оператора присваивания к rvalue.

Таким образом, в нашем коде синтезированный оператор присваивания:

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

or

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

можно вызвать с помощью rvalue Y (1) с левой стороны. Это позволяет продолжить присвоение, даже если Y(1) является значением r.

Чтобы предотвратить присвоение временным объектам, можно явно объявить оператор присваивания с помощью квалификатора ref (&):

class Y {
public:
    explicit Y(std::size_t num = 0);
    Y& operator=(Y const&) & = default;
};

В этом случае оператор присваивания не будет синтезирован, а попытка присвоить значение rvalue приведет к ошибке компиляции.

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

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

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

Copyright© 2022 湘ICP备2022001581号-3