Ответы на мини-квизы

Ответы на мини-квизы


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 метод.

Report Page