Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Redefining lambdas not allowed in C++11, why?

Example:

#include <functional>  int main() {   auto test = []{};   test = []{};        return 0; } 

This emits the following error message in gcc 4.7.2:

test.cpp: In function ‘int main()’: test.cpp:5:13: error: no match for ‘operator=’ in ‘test = <lambda closure object>main()::<lambda()>{}’ test.cpp:5:13: note: candidate is: test.cpp:4:16: note: main()::<lambda()>& main()::<lambda()>::operator=(const main()::<lambda()>&) <deleted> test.cpp:4:16: note:   no known conversion for argument 1 from ‘main()::<lambda()>’ to ‘const main()::<lambda()>&’ 

From the standard 5.1.2.3 (emphasis mine):

An implementation may define the closure type differently from what is described below provided this does not alter the observable behavior of the program other than by changing:

— the size and/or alignment of the closure type,

— whether the closure type is trivially copyable (Clause 9)

— whether the closure type is a standard-layout class (Clause 9), or

— whether the closure type is a POD class (Clause 9).

As far as I can tell, this is what I'm running up against. It's attempting to use a deleted assignment operator and failing. I am curious to know if there's an easy workaround, and more broadly what the motivating rationale for allowing copy constructibility to be omitted for lambdas generally.

like image 717
OmnipotentEntity Avatar asked Sep 12 '13 05:09

OmnipotentEntity


People also ask

What is lambda function in C++11?

In C++11 and later, a lambda expression—often called a lambda—is a convenient way of defining an anonymous function object (a closure) right at the location where it's invoked or passed as an argument to a function.

Can lambdas be templated?

From the various lambda improvements, template parameters for lambdas are my favorite ones. Lambdas support with C++20 template parameters, can be default-constructed and support copy-assignment, when they have no state, and can be used in unevaluated contexts.

Do lambdas exist in C?

No, C doesn't have lambda expressions (or any other way to create closures). This is likely so because C is a low-level language that avoids features that might have bad performance and/or make the language or run-time system more complex.

Can lambdas be Inlined?

Calls of the lambda are translated to direct calls to its operator() and can therefore be inlined.


1 Answers

You seem to think that those two lambdas have the same type, but that is not true. Each one creates its own type:

#include <functional> #include <type_traits> #include <iostream>  int main() {   auto test = []{};   auto test2 = []{};   std::cout << std::is_same< decltype( test ), decltype( test2 ) >::value << std::endl;   return 0; } 

will print 0. Of course the error message you are getting from the compiler could be a little bit clearer in this regards...

like image 170
Daniel Frey Avatar answered Oct 04 '22 14:10

Daniel Frey