const std::string s1("foo");
Это объявляет именованный объект std::string
как локальную переменную.
const std::string& s1("foo");
Это объявляет константную ссылку на std::string
объект.Создается неназванный временный объект std::string
с содержимым "foo"
, и ссылка привязывается к этому временному объекту.Временный объект будет существовать до тех пор, пока ссылка не выйдет из области видимости.
В этом конкретном случае нет заметного различия между ними: в обоих случаях вы получите std::string
, к которому можно получить доступ черезимя s1
и которое будет уничтожено, когда s1
выйдет из области видимости.
Однако в некоторых случаях есть разница.Рассмотрим, например, функцию, которая возвращает по ссылке:
const std::string& get_reference_to_string();
Если вы инициализируете s1
результатом вызова этой функции, есть разница между:
const std::string s1(get_reference_to_string());
const std::string& s1(get_reference_to_string());
В первом случае создается копия указанной строки и используется для инициализации s1
.Во втором случае s1
просто привязывается к std::string
, на который ссылается возвращаемая ссылка: копия не создается.