Почему адрес auto y = reference_to_x не совпадает с адресом x? - PullRequest
0 голосов
/ 08 мая 2018

Предположим, у вас есть следующий код:

long& fn2(long& another_var1, long another_var2){

    another_var1 = another_var1 + another_var2;
    another_var2 = another_var2 + another_var1;

    return another_var1;
}

int main (){
    cout << boolalpha;

    long var1 = 5;
    long var2 = 10;

    auto result = fn2(var1, var2);

    cout << &result << endl;
    cout << &var1 << endl;
    cout << result << endl; //Line 1
    cout << (&result == &var1) << endl; //Line 2 
}

Все работает как положено, пока вы не достигнете Line 2, где возвращается false. Когда вы auto result, предполагается, что это ссылочная переменная для another_var1, которая является ссылкой на var1, то есть все они должны иметь один и тот же адрес - это просто псевдонимы имен для одной и той же памяти. Глядя на Line 1, 15 возвращается, создавая иллюзию, что они все одинаковы. Затем Line 2 опровергает это.

Я думаю, однако, это может быть проблема с auto. Если вы удалите auto и замените его истинным типом возврата long&, вы получите ожидаемые результаты.

Может кто-нибудь объяснить, что на самом деле происходит?

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Что на самом деле происходит

auto выводит тип переменной из типа переменной, используемой для ее инициализации 1 . Я не могу найти, чтобы кто-нибудь на самом деле вышел и сказал это 2 , но я подозреваю, что ссылка не выводится, потому что нет такой вещи, как переменная ссылки. Ссылки не существуют как независимые лица. Это просто удобное новое имя, псевдоним , для существующей переменной. После того, как все ссылки решены

auto result = fn2(var1, var2);

может быть также

fn2(var1, var2);
auto result = var1;

Как получить то, что я ожидал?

Объявите новую переменную как ссылку с

auto & result = fn2(var1, var2);

Если вы создаете для C ++ 14 или более позднего стандарта, decltype можно использовать для отслеживания категории значений возвращаемого типа, lvalue ссылка , чтобы сохранить ссылка.

decltype(auto) result = fn2(var1, var2);

1 Gory details . Обратите внимание, что он использует те же правила удержания, что и шаблоны. Зачем повторяться?

2 Больше не верно . Я должен знать лучше, чем пренебрегать сначала проверкой у Херба Саттера или Скотта Мейерса.

0 голосов
/ 08 мая 2018

Когда вы auto result, это должна быть ссылочная переменная для another_var1

Вот твоя ошибка. Если result предполагается как ссылка, то вы должны объявить ссылку. Как это:

auto& result = fn2(var1, var2);
...