Тип автоматической переменной при назначении ее значения из функции, возвращаемое значение которой является ссылкой [duplicate]

У меня есть 2-строчное решение этой проблемы:

char sep = ' ';
std::string s="1 This is an example";

for(size_t p=0, q=0; p!=s.npos; p=q)
  std::cout << s.substr(p+(p!=0), (q=s.find(sep, p+1))-p-(p!=0)) << std::endl;

Тогда вместо печати вы можете поместить его в вектор.

6
задан Xeo 9 August 2012 в 16:59
поделиться

2 ответа

Самый простой способ подумать об этом - это сравнить его с выводом аргумента шаблона.

Учитывая:

template<typename T>
void deduce(T) { }

Если вы вызываете:

deduce(px);

, тогда аргумент шаблона T будет выведен как int*, и если вы назовете

deduce(rx);

, тогда T будет выведено как int, а не int&

Вы получаете те же типы, которые были выведены при использовании auto.

Можно было бы провести аналогию с типами указателей, ожидая, что выведенный тип arx будет int&

< / blockquote>

Для подобной аналогии вам придется иметь довольно запутанную модель языка C ++. Просто потому, что они объявлены синтаксически схожими способами, так как Type@ с типом и модификатором не делают их одинаковыми. Указатель - это значение, объект, и его можно скопировать и изменить его значение путем назначения. Ссылка не является объектом, это ссылка на какой-то объект. Ссылка не может быть скопирована (копирование копирует референт) или изменено (присвоение ему изменяет референт). Функция, возвращающая указатель, возвращает объект по значению (объект является объектом-указателем), но функция, возвращающая ссылку (например, ваш GetBigClass()) возвращает объект ссылка . Это совершенно другая семантика, попытка провести аналогию между указателями и ссылками обречена на провал.

6
ответ дан Jonathan Wakely 26 August 2018 в 07:57
поделиться

Использовать auto&:

auto& ref_bigclass = GetBigClass();

Предполагается, что ссылки должны быть прозрачными: любая операция над ними происходит на объекте, на который они ссылаются, нет способа «получить» ссылку.

UPD: это описано в 7.1.6.4/6:

. Когда тип идентификатора декларатора был определен в соответствии с 8.3, тип объявленной переменной с использованием declarator-id определяется по типу его инициализатора, используя правила для вывода аргумента шаблона.

И вывод аргумента шаблона определяется в 14.8.2.1/3:

Если тип параметра шаблона P является ссылочным типом, тип, обозначаемый P, используется для вывода типа.

PS Обратите внимание, что это отличается для decltype: decltype(rx) будет выдавать тип int& (7.1.6.2/4).

11
ответ дан hamstergene 26 August 2018 в 07:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: