Информация об изменениях

Сообщение Re[6]: Указать тип параметра у функтора от 31.07.2018 11:28

Изменено 31.07.2018 11:52 watchmaker

Re[6]: Указать тип параметра у функтора
Здравствуйте, B0FEE664, Вы писали:


BFE>А так нельзя?:


Это не будет работать по многим причинам.
Cоветую прочитать P0315R4 — там помимо простого "разрешить лямбды в unevaluated context" написано и про то, как это будет взаимодействовать со всем остальным языком. И вообще, зачем это надо и что можно делать.

BFE>template <class T> using OnlyStrings = decltype([](std::string const&){ });
BFE>void x(OnlyStrings f)

Для начала, в первой строке присуствует шаблонный тип T. Во второй строке же написано просто OnlyStrings. Вопрос, куда пропало T? Тип-то OnlyStrings<something>. И как его выводить?


Далее, какую сигнатуру имеет функция x? Можно сразу рассмотреть с позиции linker'а. Что он увидет для такой функции? Спойлер: в P0315 — это описано как "nightmare" (но это мелочь и обходится, если x сделать internal linkage).


Ну и главное даже не это, а то, что каждая лямбда порождает свой уникальный тип. То есть аргументом функции может быть только именно та же самая лямбда, которая была внутри decltype. Не другая лямбда с такой же сингнатурой, и тем более не другое замыкание или функция, которую можно вызвать с аргументом const std::string&. Подходит только оригинальная лямбда — та самая, у которой пустое тело.
Re[6]: Указать тип параметра у функтора
Здравствуйте, B0FEE664, Вы писали:


BFE>А так нельзя?:


Это не будет работать по многим причинам.
Cоветую прочитать P0315R4 — там помимо простого "разрешить лямбды в unevaluated context" написано и про то, как это будет взаимодействовать со всем остальным языком. И вообще, зачем это надо и что можно делать.

BFE>template <class T> using OnlyStrings = decltype([](std::string const&){ });
BFE>void x(OnlyStrings f)

Для начала, в первой строке присуствует шаблонный тип T. Во второй строке же написано просто OnlyStrings. Вопрос, куда пропало T? Тип-то OnlyStrings<something>. И как его выводить?


Далее, какую сигнатуру имеет функция x? Можно сразу рассмотреть с позиции linker'а. Что он увидет для такой функции? Спойлер: в P0315 — это описано как "nightmare" (но это мелочь и обходится, если x сделать internal linkage).


Ну и главное даже не это, а то, что каждая лямбда порождает свой уникальный тип. То есть аргументом функции может быть только именно та же самая лямбда, которая была внутри decltype. Не другая лямбда с такой же сингнатурой, и тем более не другое замыкание или функция, которую можно вызвать с аргументом const std::string&. Подходит только оригинальная лямбда — та самая, у которой пустое тело. (а если бы в C++20 не добавили default конструктор к лямбдам без захвата, то функцию x вообще бы было невозмножно вызвать, так как единственный объект подходящего типа присутствовал только внутри decltype).