170 похожих чатов

Всем привет. Ктонибудь может ответить почему в c++ template <typename T> void

f(T&& arg)

Здесь T&& это универсальная ссылка

А тут

template <typename T>
struct S
{
void f(T&& arg) // это уже rvalue ссылка
}

В чем тут логика, почему во втором случае это не универсальная ссылка?

13 ответов

5 просмотров

Потому что во втором случае при вызове f, класс уже должен быть инстанцирован некоторым конкретным T и не будет выводиться из arg во время вызова

И да, >> void f(T&& arg) // это уже rvalue ссылка Это ошибочный вывод, сжатие ссылок никуда не делось

Eugene- Автор вопроса

Не соберётся этот пример без явного std::move и приведения в рвалуе

Eugene
Не соберётся этот пример без явного std::move и пр...

Советую проверять свои суждения перед ответом :) https://godbolt.org/z/8G3Y51jbq

Eugene- Автор вопроса
Ofee Oficsu
Потому что во втором случае при вызове f, класс уж...

Благодарю за подсказку, все равно это странно

T&& - универсальная ссылка, когда она непосредственно выводимая. В случае struct T уже выведено и является непосредственно каким то конкретным типом. Поэтому уже не универсальная, а конкретная.

Int Unsigned
T&& - универсальная ссылка, когда она непосредстве...

ПС. Когда видите конструкцию template<typename T> somewhat(T&&). Думайте об это НЕ "я декларирую T&&", Это некоторая "конструкция языка T&&", которая становится типом, которым ее инициализировали.

Int Unsigned
ПС. Когда видите конструкцию template<typename T> ...

Это просто ссылка, которая сожмётся при выводе аргумента (в обоих случаях), никакой магической конструкции в обоих случаях нет, как и нет особых правил, отличающих их друг от друга

Ofee Oficsu
Это просто ссылка, которая сожмётся при выводе арг...

Она сначала "конструкция", которая получает свой тип по правилу сжатия ссылок. Кстати прикольно раздумывать над auto&& x = -somewhat-

Во втором случае просто T в рамках структуры это уже конкретный тип. Поэтому и T&& приобретает более конкретное значение.

Dmitry Sokolov
Во втором случае просто T в рамках структуры это у...

ну это если ты вместо компилятора подставил тип) по идее с помощью ctad можно компилятор заставить его выводить, как и для функции

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

Обсуждают сегодня

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
есть тут кто-то , кто только начал изучать си? если проходите курс на степике или как-то сами изучаете, пишите, может, скооперируемся?..
Eule
25
Слушайте, ещё такая интересная задачка. Сделан аудит действий пользователей через триггеры в базе, соответственно каждый пользователь имеет свой логин и пароль в базе. Это пре...
Сергей Бычков
12
Скажите, тут нет проблемы? IMyInterface1 = interface function GetInterface2: IInterface2; ... function TMyInterface.GetInterface2: IInterface2; begin Result := TI...
Ruslan aka DUDE
18
вопрос по москвину - не понимаю вот такого вопроса похоже Сколько разных всегда завершающихся функций с типом a -> a -> b -> a -> a можно реализовать? Две функции одинаково...
Fedor
11
Кстати, раз про скачивание файлов разговор зашел) Сделал бота для себя (транскрибирующего и суммаризирующего встречи) но не ожидал что за 2 месяца 10к пользователей набежит😅...
Andrey Obolenskiy
8
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Утра доброго. Просветите пожалуйста. Хочу сделать rest сервер на делфи. Посмотрел 3 фреймворка: dmvc, Mars, mormot. Ни в одном из них не упоминается ассинхронная обработка вхо...
Сергей Бычков
10
возможно для форматирования TimeStampZ нужен другой механизм, не?
Роман Лях (rgreat)
13
Карта сайта