Я играю с шаблонами и синтаксисом С++ и заметил, что вы можете передавать по ссылке, просто вызывая add(2,3), когда функция определена, как показано ниже:
#include <iostream>
using namespace std;
auto add(const int& lhs, const int& rhs)
{
return lhs + rhs;
}
int main()
{
cout << add(2, 3) << '\n';
getchar();
return 0;
}
Почему это незаконно:
int& r = 3;
но я могу вызвать add(2,3) без проблем, разве я не делаю то же самое в обоих случаях, присваивая rvalue ссылке?
Вам не разрешено назначать значения r для ссылок непостоянный.
... затем проверьте законность add(int& lhs, int& rhs)
с помощью add(2, 3)
if I am not allowed to assign rvalues to reference why does the following snippet work
Потому что ты ошибся. Вы являются разрешили инициализировать ссылки lvalue на const с помощью rvalue.
how does this work?
Создается временный объект, и ссылка привязывается к этому временному объекту.
Кроме того, время жизни временного объекта обычно равно концу полного выражения, но при привязке к ссылке это время жизни продлевается на время жизни ссылки. В данном конкретном случае ссылочный аргумент не имеет большего времени жизни, чем полное выражение, в котором находится вызов функции, поэтому это правило не важно.
How come doing this is illegal:
int& r = 3;
Потому что r
не является ссылкой на const. Это ссылка на неконстанту.
Если бы вы изменили константу ссылки, то это было бы правильно сформировано, и правило из абзаца выше стало бы актуальным.
@JesperJuhl Это было бы заблуждением. Можно привязать временное значение к неконстантной ссылке на значение rvalue, и время жизни будет точно так же увеличено.
Попробуйте
const int &r = 3