Почему функции, которая получает ссылку, можно дать только объект (а не ссылку)?Ссылка автоматически сделана? - PullRequest
1 голос
/ 23 мая 2019

Например:

void do_something(int& x){ 
//this function asks for a reference to an int,
//since the type of its argument is int&
}

int main() { 


    int x = 4; //the variable x is simply an int; it isn't a reference?
    int& y = x; //the variable y is a reference to x

    do_something(y); //this works, as expected                

    do_something(x);      
    //this calls the method with an int, instead of a reference. 
    //Why does this work? It's not giving the function what the function is
    //asking for. 
}

Почему работает do_something(x)?Это не дает функции то, что запрашивает функция.Единственное объяснение, которое я могу придумать, заключается в том, что для функции int, передаваемой в функцию, для нее создается ссылка, и эта ссылка в конечном итоге передается функции.

Ответы [ 4 ]

7 голосов
/ 23 мая 2019

Один из способов взглянуть на ссылку - это воспринимать ее как псевдоним.Это просто новое имя для существующего объекта, и вы можете использовать существующее имя или новое, которое вы ему дали.Это означает, что

void do_something(int& x)

на самом деле не нужно передавать ссылку на него.Это говорит о том, что x будет ссылкой на некоторый int объект.Глядя на это таким образом, совершенно логично, что вы можете передать int в do_something, потому что вы даете ему int, на который будет ссылаться x.

Это также работает другим способомвокруг.Если бы вместо этого у вас был

void do_something(int x)

, вы все равно могли бы передать ему y, поскольку y - это просто имя для int.

5 голосов
/ 23 мая 2019

Если бы ссылка могла быть связана только с другими ссылками, то не было бы никакого способа сослаться на объект.

do_something(x) работает так же, как int& y = x. В обоих случаях ссылочная переменная связана с объектом. В случае вызова функции ссылочная переменная является параметром.

Единственное объяснение, которое я могу придумать, заключается в том, что для функции int, переданной функции, для нее создана ссылка

Все параметры функции - и в целом все переменные (параметры функции по сути являются локальными переменными) - "создаются" (хотя это зависит от того, что подразумевается под "созданием"). Если переменная является ссылкой, то ссылка создается. Если переменная не является ссылкой, создается объект.

2 голосов
/ 23 мая 2019

Вы можете представить себе функцию

void do_something(int& parn){ 
    //...
}

и его вызов

int x = 4; //the variable x is simply an int; it isn't a reference?

do_something(x);   

следующим образом

int x = 4; //the variable x is simply an int; it isn't a reference?

do_something(x);  

// ...

void do_something( /* int& parn */ ){
    int &parm = x;  
    //...
}

То есть параметр функции (то есть локальная переменная функции), имеющий ссылочный тип, инициализируется аргументом. Теперь параметр parm ссылается на переменную x. Его можно рассматривать как псевдоним для переменной x внутри функции.

Единственная разница между этим ссылочным объявлением внутри функции

void do_something( /* int& parn */ ){
    int &parm = x;  
    //...
}

и это объявление в основном

int& y = x;

означает, что переменная parm (параметр функции) имеет область действия функции.

0 голосов
/ 23 мая 2019

"Почему функция, которая получает ссылку, может быть задана только объектом (а не ссылкой)? Автоматически создается ссылка?"

Да. Ссылка на передаваемый объект формируется при вызове функции.

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