Как работает универсальная лямбда ( auto
ключевое слово как тип аргумента) в стандарте C ++ 14?
Основан ли он на шаблонах C ++, где для каждого другого типа аргумента компилятор генерирует новую функцию с тем же телом, но замененными типами (полиморфизм во время компиляции), или он больше похож на дженерики Java (стирание типов)?
Пример кода:
auto glambda = [](auto a) { return a; };
Ответы:
Общие лямбды были введены в
C++14
.Проще говоря, тип замыкания, определенный лямбда-выражением, будет иметь шаблонный оператор вызова, а не обычный, не шаблонный оператор вызова лямбда-выражений
C++11
(конечно, когда онauto
хотя бы один раз появляется в списке параметров).Итак, ваш пример:
Сделаем
glambda
экземпляр такого типа:В параграфе 5.1.2 / 5 стандартного проекта C ++ 14 n3690 указывается, как определяется оператор вызова типа закрытия данного лямбда-выражения:
В заключение:
Как поясняется в предыдущем абзаце, общие лямбды - это просто синтаксический сахар для уникальных безымянных функторов с шаблонным оператором вызова. Это должно ответить на ваш вопрос :)
источник
int main () { struct X {}; std::vector<X> x; }
)К сожалению , они не являются частью C ++ 11 ( http://ideone.com/NsqYuq ):
С g ++ 4.7:
Однако способ его реализации в C ++ 14 в соответствии с предложением Портленда для общих лямбда-выражений :
Это приведет по большей части к обычному созданию класса анонимного функтора, но при отсутствии типов компилятор будет выдавать шаблонный член -
operator()
:Или в соответствии с новым предложением Proposal for Generic (Polymorphic) Lambda Expressions
Итак, да, для каждой перестановки параметров будет возникать новый экземпляр, однако члены этого функтора все равно будут совместно использоваться (то есть захваченные аргументы).
источник
-std=c++1y
.auto
есть те же правила удержания, что у классического авто? Если мы обратимся к шаблонной аналогии, это будет означать, что auto не является автоматическим, это те же правила, что и выведение типа шаблона. Тогда возникает вопрос: эквивалентноauto
ли выведение по шаблону ?static
илиregister
:) В любом случае, да, использованиеauto
там означает, что под капотом генерируется обычный шаблон. Фактически, лямбда-выражение будет заменено внутри компилятора классом функтора, аauto
параметр означает, чтоtemplate <T> ... (T ...)
он будет испущен.Это предлагаемая функция C ++ 14 (не в C ++ 11), аналогичная (или даже эквивалентная) шаблонам. Например, N3559 предоставляет следующий пример:
источник