У меня есть 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;
Тогда вместо печати вы можете поместить его в вектор.
Самый простой способ подумать об этом - это сравнить его с выводом аргумента шаблона.
Учитывая:
template<typename T>
void deduce(T) { }
Если вы вызываете:
deduce(px);
, тогда аргумент шаблона T
будет выведен как int*
, и если вы назовете
deduce(rx);
, тогда T
будет выведено как int
, а не int&
Вы получаете те же типы, которые были выведены при использовании auto
.
Можно было бы провести аналогию с типами указателей, ожидая, что выведенный тип
< / blockquote>arx
будетint&
Для подобной аналогии вам придется иметь довольно запутанную модель языка C ++. Просто потому, что они объявлены синтаксически схожими способами, так как
Type@
с типом и модификатором не делают их одинаковыми. Указатель - это значение, объект, и его можно скопировать и изменить его значение путем назначения. Ссылка не является объектом, это ссылка на какой-то объект. Ссылка не может быть скопирована (копирование копирует референт) или изменено (присвоение ему изменяет референт). Функция, возвращающая указатель, возвращает объект по значению (объект является объектом-указателем), но функция, возвращающая ссылку (например, вашGetBigClass()
) возвращает объект ссылка . Это совершенно другая семантика, попытка провести аналогию между указателями и ссылками обречена на провал.
Использовать auto&
:
auto& ref_bigclass = GetBigClass();
Предполагается, что ссылки должны быть прозрачными: любая операция над ними происходит на объекте, на который они ссылаются, нет способа «получить» ссылку.
UPD: это описано в 7.1.6.4/6:
. Когда тип идентификатора декларатора был определен в соответствии с 8.3, тип объявленной переменной с использованием declarator-id определяется по типу его инициализатора, используя правила для вывода аргумента шаблона.
blockquote>И вывод аргумента шаблона определяется в 14.8.2.1/3:
Если тип параметра шаблона P является ссылочным типом, тип, обозначаемый P, используется для вывода типа.
blockquote>PS Обратите внимание, что это отличается для
decltype
:decltype(rx)
будет выдавать типint&
(7.1.6.2/4).