Size: a a a

cxx.Дискуссионная

2020 April 19

O

Ofee in cxx.Дискуссионная
Roy Mustang
Если учесть что шаблонный метод может вызываться как с rvalue передачей, так и с lvalue, то это означает что я должен использовать auto&& wtf = std::forward<T>(t) для выведения типов
Тебе не проще подсмотреть реализацию всех перегрузок std::forward в стандартной библиотеке, чтобы понять, как работает и что нужно?
источник

RM

Roy Mustang in cxx.Дискуссионная
Ofee
Тебе не проще подсмотреть реализацию всех перегрузок std::forward в стандартной библиотеке, чтобы понять, как работает и что нужно?
Я уже давно все это посмотрел раз 10
источник

RM

Roy Mustang in cxx.Дискуссионная
На момент вызова std::forward тип T уже не является универсальной ссылкой
источник

RM

Roy Mustang in cxx.Дискуссионная
или я чего то не понимаю?
источник

RM

Roy Mustang in cxx.Дискуссионная
универсальная ссылка универсальна только для метода шаблонного, а на момент вызова внутри него std::forward T уже не является универсальной, разве нет?
источник

RM

Roy Mustang in cxx.Дискуссионная
Хотя для forward это все равно
источник

RM

Roy Mustang in cxx.Дискуссионная
В общем, я просто ищу ответа на простой вопрос "std::forward возвращает rvalue ссылку на объект, который может быть как lvalue так и rvalue объектом?"
источник

RM

Roy Mustang in cxx.Дискуссионная
Верно ли это утверждение?
источник

O

Ofee in cxx.Дискуссионная
Roy Mustang
std::forward разве не всегда возвращает rvalue ссылку на объект?
template<typename T>
void foo(T&& arg) {
   static_assert(
       std::is_same_v<
           decltype(std::forward<T>(arg)),
           int&
        >);
}

template<typename T>
void bar(T&& arg) {
   static_assert(
       std::is_same_v<
           decltype(std::forward<T>(arg)),
           int&&
        >);
}

int main() {
   int x = 42;
   foo(x);
   bar(std::move(x));
}
источник

O

Ofee in cxx.Дискуссионная
Roy Mustang
На момент вызова std::forward тип T уже не является универсальной ссылкой
А там в магии перегрузок участвует не только шаблонный параметр T, но ещё и аргумент, который тоже имеет тип
источник

O

Ofee in cxx.Дискуссионная
Roy Mustang
Верно ли это утверждение?
Вероятно, нет. А может, я что-то не так понял, в любом случае смотри мой код выше
источник

RM

Roy Mustang in cxx.Дискуссионная
Да, твой пример хорошо ответил на мой вопрос
источник

RM

Roy Mustang in cxx.Дискуссионная
Там вся изюминка форварда заключается в том, чем является <T>
источник

RM

Roy Mustang in cxx.Дискуссионная
То есть, если это rvalue, то наш T будет к примеру int, и тем самым каст будет к &&, а если к примеру T - это T&, то каст будет к T&
источник

RM

Roy Mustang in cxx.Дискуссионная
Не знаю кто это придумал в комитете, но этот артхаус каким то волшебным образом взаимососуществует в С++
источник

А

Андрей in cxx.Дискуссионная
вся магия в схлопывании ссылок
источник

RM

Roy Mustang in cxx.Дискуссионная
Андрей
вся магия в схлопывании ссылок
Там куда больше магий чем я предполагал, я так понимаю, фундаментом всего служит тип: lvalue или rvalue, а затем, волшебство сжатия ссылок создает некий костыль, который потом превращается в волшебство кастов
источник

А

Андрей in cxx.Дискуссионная
да нет
источник

RM

Roy Mustang in cxx.Дискуссионная
Что форвард собственно и демонстрирует
источник

А

Андрей in cxx.Дискуссионная
там тупо статик каст
источник