Создается ли временный объект путем вызова функции с литералом цифрой c? - PullRequest
1 голос
/ 06 марта 2020

Предположим, у меня есть что-то простое:

void f(int a){...}
int main()
{
   f(3);
   return 0;
}

Как происходит инициализация на немного более низком уровне абстракции, когда мы вызываем f (3)? Создается ли временный объект со значением 3 или он просто инициализируется путем инициализации копирования?

В первую очередь причина, по которой это было задано, была, когда я обнаружил, что в этом коде:

void f(int a){...}
void f(int&& a){...}
int main()
{
   f(3);
   return 0;
}

... Я получаю ошибку, говоря, что это неоднозначно. Поскольку я совершенно уверен, что при вызове функции f (int && a) мы получим создание временного объекта, который получает расширение на всю жизнь со ссылкой a, я бы также сказал, что вызов f (int a) также вызывает создание временный характер. Иначе, не должен ли компилятор выбрать, чтобы f (int a) был более эффективным?

Также есть книга, которая может элегантно освещать эту топику c?

1 Ответ

5 голосов
/ 06 марта 2020

Семантически (забывая про встраивание, оптимизацию и прочее), первый фрагмент не требует временного.

void f(int a){...}

Когда вы вызываете эту функцию, как в f(3), целочисленный объект создается с использованием (псевдо) ) конструктор копирования int для использования в качестве аргумента функции. Это становится локальным параметром для функции, и его время жизни заканчивается, когда функция возвращается.

Между тем, второй фрагмент

void f(int&& a){...}

требует вызова кода для создания временной переменной int (как Вы не можете привязать ссылку любого типа к цифре c. После этого ссылка на значение rvalue привязывается к созданному временному.

А на ваш вопрос «эффективности» компиляторы не выбирают перегрузки функций на основе эффективности. Они делают это на основе определенного рейтинга конверсий, и в вашем случае копия и привязка ссылки имеют одинаковый ранг. Подробнее о разрешении перегрузки можно прочитать здесь: https://en.cppreference.com/w/cpp/language/overload_resolution

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...