Ответы на мини-квизы
1 кейс
```cpp
struct SomeClass {
void foo() & {std::cout << "Call on lvalue reference" << std::endl;} //1
void foo() const & {std::cout << "Call on const lvalue reference" << std::endl;} //2
// void foo() && {std::cout << "Call on rvalue reference" << std::endl;} //3
// void foo() const && {std::cout << "Call on const rvalue reference" << std::endl;} //4
};
int main() {
SomeClass lvalue;
lvalue.foo();
SomeClass{}.foo();
}
```
Ответ: Вызовутся 1 и 2 методы. Для первого вызова идеальным кандидатом будет метод номер 1. Для второго, за неимением rvalue перегрузок, выберется 2 метод, так как любые rvalue ref могут приводиться к const lvalue ref.
2 кейс
```cpp
struct SomeClass {
// void foo() & {std::cout << "Call on lvalue reference" << std::endl;} //1
void foo() const & {std::cout << "Call on const lvalue reference" << std::endl;} //2
void foo() && = delete; //3
void foo() const && {std::cout << "Call on const rvalue reference" << std::endl;} //4
};
int main() {
SomeClass lvalue;
lvalue.foo();
SomeClass{}.foo();
}
```
Ответ: ошибка компиляции на втором вызове. Удаленные функции участвуют в разрешении перегрузки. И даже если у нас есть методы 2 и 4, которые могут быть вызваны для rvalue ref, самым подходящим вариантом будет именно метод 3. А он удален. Поэтому компилятор решит, что мы хотим вызвать удаленную форму, и запретит нам это делать.
3 кейс
```cpp
struct SomeClass {
// void foo() & {std::cout << "Call on lvalue reference" << std::endl;} //1
void foo() const & {std::cout << "Call on const lvalue reference" << std::endl;} //2
void foo() && {std::cout << "Call on rvalue reference" << std::endl;} //3
// void foo() const && {std::cout << "Call on const rvalue reference" << std::endl;} //4
};
int main() {
SomeClass lvalue;
lvalue.foo();
const_cast<const SomeClass&&>(lvalue).foo();
}
```
Ответ: Оба раза вызовется 2 метод. Для первого вызова единственным подходящим кандидатом будет 2 метод. Второй вызов похитрее - мы конст кастом кастим lvalue к const rvalue ref и потом вызываем метод. Для rvalue у нас есть перегрузка, однако для константных объектов она не может быть выбрана. Поэтому для второго вызова единственным подходящим вариантом будет 2 метод.