Ссылочная инициализация с помощью конструктора - PullRequest
1 голос
/ 19 марта 2020
const T   a {}; // constant of type T
const T&  b {}; // ???
      T   c {}; // variable of type T
      T&  d {}; // error

В чем разница между a и b?
b является ссылкой, но я не назначаю ему объект: в этой инструкции я инициализирую его конструктором T.
Адрес b находится между адресами a и c, поэтому, похоже, b и a не имеют различий.

И если я могу объявить и инициализировать b почему d выдает ошибку компиляции?

Я говорил о обобщенном c типе T. Я тестировал приведенный выше код либо для примитивных типов и классов, и результаты совпадают.

1 Ответ

1 голос
/ 20 марта 2020

В этих объявлениях

const T   a {}; // constant of type T
const T&  b {}; 

создается постоянный объект a, инициализированный по умолчанию, и постоянная ссылка b на временный объект, инициализированный по умолчанию.

Выдает компилятор ошибка для этого объявления ссылки

T&  d {}; // error

, потому что объявлена ​​непостоянная ссылка на временный объект.

Вы можете объявить ссылку на rvalue следующим образом

T && d {};

Вот демонстрационная программа

#include <iostream>

int main() 
{
    const int &ri {};

    std::cout << "ri = " << ri << '\n';

    int && rri {};

    std::cout << "rri = " << rri << '\n';

    return 0;
}

Вывод программы:

ri = 0
rri = 0
...