Присвоение 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