What is the need of template lambda introduced in C++20 when C++14 already has generic lambda?
c++14 introduced generic lambdas that made it possible to write following:
auto func = (auto a, auto b){
return a + b;
};
auto Foo = func(2, 5);
auto Bar = func("hello", "world");
It is very clear that this generic lambda func
works just like a templated function func
would work.
Why did the C++ committee decide to add template syntax for generic lamda?
c++ c++14 c++20
add a comment |
c++14 introduced generic lambdas that made it possible to write following:
auto func = (auto a, auto b){
return a + b;
};
auto Foo = func(2, 5);
auto Bar = func("hello", "world");
It is very clear that this generic lambda func
works just like a templated function func
would work.
Why did the C++ committee decide to add template syntax for generic lamda?
c++ c++14 c++20
4
What if you need to use a different template type than for the arguments or return type? And what if it's needed inside the body?
– Some programmer dude
18 hours ago
I've been told this was an interesting use case.
– Max Langhof
18 hours ago
add a comment |
c++14 introduced generic lambdas that made it possible to write following:
auto func = (auto a, auto b){
return a + b;
};
auto Foo = func(2, 5);
auto Bar = func("hello", "world");
It is very clear that this generic lambda func
works just like a templated function func
would work.
Why did the C++ committee decide to add template syntax for generic lamda?
c++ c++14 c++20
c++14 introduced generic lambdas that made it possible to write following:
auto func = (auto a, auto b){
return a + b;
};
auto Foo = func(2, 5);
auto Bar = func("hello", "world");
It is very clear that this generic lambda func
works just like a templated function func
would work.
Why did the C++ committee decide to add template syntax for generic lamda?
c++ c++14 c++20
c++ c++14 c++20
edited 14 hours ago
JavaA
1711
1711
asked 18 hours ago
coder3101coder3101
1,219815
1,219815
4
What if you need to use a different template type than for the arguments or return type? And what if it's needed inside the body?
– Some programmer dude
18 hours ago
I've been told this was an interesting use case.
– Max Langhof
18 hours ago
add a comment |
4
What if you need to use a different template type than for the arguments or return type? And what if it's needed inside the body?
– Some programmer dude
18 hours ago
I've been told this was an interesting use case.
– Max Langhof
18 hours ago
4
4
What if you need to use a different template type than for the arguments or return type? And what if it's needed inside the body?
– Some programmer dude
18 hours ago
What if you need to use a different template type than for the arguments or return type? And what if it's needed inside the body?
– Some programmer dude
18 hours ago
I've been told this was an interesting use case.
– Max Langhof
18 hours ago
I've been told this was an interesting use case.
– Max Langhof
18 hours ago
add a comment |
4 Answers
4
active
oldest
votes
C++14 generic lambdas are a very cool way to generate a functor with an operator ()
that looks like this:
template <class T, class U>
auto operator()(T t, U u) const;
But not like this:
template <class T>
auto operator()(T t1, T t2) const; // Same type please
Nor like this:
template <class T, std::size_t N>
auto operator()(std::array<T, N> const &) const; // Only `std::array` please
Nor like this (although this gets a bit tricky to actually use):
template <class T>
auto operator()() const; // No deduction
C++14 lambdas are fine, but C++20 allows us to implement these cases without hassle.
add a comment |
Since you can use templated lambdas in C++20, you can restrict your types in an easier way than SFINAE expression:
auto lambda = <typename T>(std::vector<T> t){};
This lambda will work only with vector types.
7
How isconsteval
related to the new syntax? It's cool and all, but I don't get the relevance.
– StoryTeller
18 hours ago
It is more an information about what C++20 add to the lambda expression than an answer to the question
– Antoine Morrier
18 hours ago
add a comment |
The new "familiar template syntax" for lambdas introduced in C++20
makes constructs such asfor_types
andfor_range
viable and way more
readable compared to C++17 alternatives.
(source: compile-time iteration with C++20 lambdas)
Another interesting thing that can be done on both C++14 and C++17 generic lambdas is directly calling operator()
by explicitly passing a template parameter:
C++14:
auto l = (auto){ };
l.template operator()<int>(0);
C++20:
auto l = <typename T>(){ };
l.template operator()<int>();
The C++14 example above is quite useless: there's no way of referring to the type provided to operator()
in the body of the lambda without giving the argument a name and using decltype
. Additionally, we're forced to pass an argument even though we might not need it.
The C++20 example shows how T is easily accessible in the body of the lambda and that a nullary lambda can now be arbitrarily templated. This is going to be very useful for the implementation of the aforementioned compile-time constructs
New contributor
add a comment |
The proposal that was accepted into C++20 has a lengthy motivation section, with examples. The premise of it is this:
There are a few key reasons why the current syntax for defining
generic lambdas is deemed insufficient by the author. The gist of it is
that some things that can be done easily with normal function templates
require significant hoop jumping to be done with generic lambdas, or
can’t be done at all.The author thinks that lambdas are valuable
enough that C++ should support them just as well as normal function
templates.
Following that are quite a few examples.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54126204%2fwhat-is-the-need-of-template-lambda-introduced-in-c20-when-c14-already-has-g%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
4 Answers
4
active
oldest
votes
4 Answers
4
active
oldest
votes
active
oldest
votes
active
oldest
votes
C++14 generic lambdas are a very cool way to generate a functor with an operator ()
that looks like this:
template <class T, class U>
auto operator()(T t, U u) const;
But not like this:
template <class T>
auto operator()(T t1, T t2) const; // Same type please
Nor like this:
template <class T, std::size_t N>
auto operator()(std::array<T, N> const &) const; // Only `std::array` please
Nor like this (although this gets a bit tricky to actually use):
template <class T>
auto operator()() const; // No deduction
C++14 lambdas are fine, but C++20 allows us to implement these cases without hassle.
add a comment |
C++14 generic lambdas are a very cool way to generate a functor with an operator ()
that looks like this:
template <class T, class U>
auto operator()(T t, U u) const;
But not like this:
template <class T>
auto operator()(T t1, T t2) const; // Same type please
Nor like this:
template <class T, std::size_t N>
auto operator()(std::array<T, N> const &) const; // Only `std::array` please
Nor like this (although this gets a bit tricky to actually use):
template <class T>
auto operator()() const; // No deduction
C++14 lambdas are fine, but C++20 allows us to implement these cases without hassle.
add a comment |
C++14 generic lambdas are a very cool way to generate a functor with an operator ()
that looks like this:
template <class T, class U>
auto operator()(T t, U u) const;
But not like this:
template <class T>
auto operator()(T t1, T t2) const; // Same type please
Nor like this:
template <class T, std::size_t N>
auto operator()(std::array<T, N> const &) const; // Only `std::array` please
Nor like this (although this gets a bit tricky to actually use):
template <class T>
auto operator()() const; // No deduction
C++14 lambdas are fine, but C++20 allows us to implement these cases without hassle.
C++14 generic lambdas are a very cool way to generate a functor with an operator ()
that looks like this:
template <class T, class U>
auto operator()(T t, U u) const;
But not like this:
template <class T>
auto operator()(T t1, T t2) const; // Same type please
Nor like this:
template <class T, std::size_t N>
auto operator()(std::array<T, N> const &) const; // Only `std::array` please
Nor like this (although this gets a bit tricky to actually use):
template <class T>
auto operator()() const; // No deduction
C++14 lambdas are fine, but C++20 allows us to implement these cases without hassle.
answered 18 hours ago
QuentinQuentin
45k586141
45k586141
add a comment |
add a comment |
Since you can use templated lambdas in C++20, you can restrict your types in an easier way than SFINAE expression:
auto lambda = <typename T>(std::vector<T> t){};
This lambda will work only with vector types.
7
How isconsteval
related to the new syntax? It's cool and all, but I don't get the relevance.
– StoryTeller
18 hours ago
It is more an information about what C++20 add to the lambda expression than an answer to the question
– Antoine Morrier
18 hours ago
add a comment |
Since you can use templated lambdas in C++20, you can restrict your types in an easier way than SFINAE expression:
auto lambda = <typename T>(std::vector<T> t){};
This lambda will work only with vector types.
7
How isconsteval
related to the new syntax? It's cool and all, but I don't get the relevance.
– StoryTeller
18 hours ago
It is more an information about what C++20 add to the lambda expression than an answer to the question
– Antoine Morrier
18 hours ago
add a comment |
Since you can use templated lambdas in C++20, you can restrict your types in an easier way than SFINAE expression:
auto lambda = <typename T>(std::vector<T> t){};
This lambda will work only with vector types.
Since you can use templated lambdas in C++20, you can restrict your types in an easier way than SFINAE expression:
auto lambda = <typename T>(std::vector<T> t){};
This lambda will work only with vector types.
edited 14 hours ago
anatolyg
16.8k44590
16.8k44590
answered 18 hours ago
Antoine MorrierAntoine Morrier
1,734518
1,734518
7
How isconsteval
related to the new syntax? It's cool and all, but I don't get the relevance.
– StoryTeller
18 hours ago
It is more an information about what C++20 add to the lambda expression than an answer to the question
– Antoine Morrier
18 hours ago
add a comment |
7
How isconsteval
related to the new syntax? It's cool and all, but I don't get the relevance.
– StoryTeller
18 hours ago
It is more an information about what C++20 add to the lambda expression than an answer to the question
– Antoine Morrier
18 hours ago
7
7
How is
consteval
related to the new syntax? It's cool and all, but I don't get the relevance.– StoryTeller
18 hours ago
How is
consteval
related to the new syntax? It's cool and all, but I don't get the relevance.– StoryTeller
18 hours ago
It is more an information about what C++20 add to the lambda expression than an answer to the question
– Antoine Morrier
18 hours ago
It is more an information about what C++20 add to the lambda expression than an answer to the question
– Antoine Morrier
18 hours ago
add a comment |
The new "familiar template syntax" for lambdas introduced in C++20
makes constructs such asfor_types
andfor_range
viable and way more
readable compared to C++17 alternatives.
(source: compile-time iteration with C++20 lambdas)
Another interesting thing that can be done on both C++14 and C++17 generic lambdas is directly calling operator()
by explicitly passing a template parameter:
C++14:
auto l = (auto){ };
l.template operator()<int>(0);
C++20:
auto l = <typename T>(){ };
l.template operator()<int>();
The C++14 example above is quite useless: there's no way of referring to the type provided to operator()
in the body of the lambda without giving the argument a name and using decltype
. Additionally, we're forced to pass an argument even though we might not need it.
The C++20 example shows how T is easily accessible in the body of the lambda and that a nullary lambda can now be arbitrarily templated. This is going to be very useful for the implementation of the aforementioned compile-time constructs
New contributor
add a comment |
The new "familiar template syntax" for lambdas introduced in C++20
makes constructs such asfor_types
andfor_range
viable and way more
readable compared to C++17 alternatives.
(source: compile-time iteration with C++20 lambdas)
Another interesting thing that can be done on both C++14 and C++17 generic lambdas is directly calling operator()
by explicitly passing a template parameter:
C++14:
auto l = (auto){ };
l.template operator()<int>(0);
C++20:
auto l = <typename T>(){ };
l.template operator()<int>();
The C++14 example above is quite useless: there's no way of referring to the type provided to operator()
in the body of the lambda without giving the argument a name and using decltype
. Additionally, we're forced to pass an argument even though we might not need it.
The C++20 example shows how T is easily accessible in the body of the lambda and that a nullary lambda can now be arbitrarily templated. This is going to be very useful for the implementation of the aforementioned compile-time constructs
New contributor
add a comment |
The new "familiar template syntax" for lambdas introduced in C++20
makes constructs such asfor_types
andfor_range
viable and way more
readable compared to C++17 alternatives.
(source: compile-time iteration with C++20 lambdas)
Another interesting thing that can be done on both C++14 and C++17 generic lambdas is directly calling operator()
by explicitly passing a template parameter:
C++14:
auto l = (auto){ };
l.template operator()<int>(0);
C++20:
auto l = <typename T>(){ };
l.template operator()<int>();
The C++14 example above is quite useless: there's no way of referring to the type provided to operator()
in the body of the lambda without giving the argument a name and using decltype
. Additionally, we're forced to pass an argument even though we might not need it.
The C++20 example shows how T is easily accessible in the body of the lambda and that a nullary lambda can now be arbitrarily templated. This is going to be very useful for the implementation of the aforementioned compile-time constructs
New contributor
The new "familiar template syntax" for lambdas introduced in C++20
makes constructs such asfor_types
andfor_range
viable and way more
readable compared to C++17 alternatives.
(source: compile-time iteration with C++20 lambdas)
Another interesting thing that can be done on both C++14 and C++17 generic lambdas is directly calling operator()
by explicitly passing a template parameter:
C++14:
auto l = (auto){ };
l.template operator()<int>(0);
C++20:
auto l = <typename T>(){ };
l.template operator()<int>();
The C++14 example above is quite useless: there's no way of referring to the type provided to operator()
in the body of the lambda without giving the argument a name and using decltype
. Additionally, we're forced to pass an argument even though we might not need it.
The C++20 example shows how T is easily accessible in the body of the lambda and that a nullary lambda can now be arbitrarily templated. This is going to be very useful for the implementation of the aforementioned compile-time constructs
New contributor
edited 17 hours ago
Toby Speight
16.4k133965
16.4k133965
New contributor
answered 18 hours ago
Hamza.SHamza.S
383210
383210
New contributor
New contributor
add a comment |
add a comment |
The proposal that was accepted into C++20 has a lengthy motivation section, with examples. The premise of it is this:
There are a few key reasons why the current syntax for defining
generic lambdas is deemed insufficient by the author. The gist of it is
that some things that can be done easily with normal function templates
require significant hoop jumping to be done with generic lambdas, or
can’t be done at all.The author thinks that lambdas are valuable
enough that C++ should support them just as well as normal function
templates.
Following that are quite a few examples.
add a comment |
The proposal that was accepted into C++20 has a lengthy motivation section, with examples. The premise of it is this:
There are a few key reasons why the current syntax for defining
generic lambdas is deemed insufficient by the author. The gist of it is
that some things that can be done easily with normal function templates
require significant hoop jumping to be done with generic lambdas, or
can’t be done at all.The author thinks that lambdas are valuable
enough that C++ should support them just as well as normal function
templates.
Following that are quite a few examples.
add a comment |
The proposal that was accepted into C++20 has a lengthy motivation section, with examples. The premise of it is this:
There are a few key reasons why the current syntax for defining
generic lambdas is deemed insufficient by the author. The gist of it is
that some things that can be done easily with normal function templates
require significant hoop jumping to be done with generic lambdas, or
can’t be done at all.The author thinks that lambdas are valuable
enough that C++ should support them just as well as normal function
templates.
Following that are quite a few examples.
The proposal that was accepted into C++20 has a lengthy motivation section, with examples. The premise of it is this:
There are a few key reasons why the current syntax for defining
generic lambdas is deemed insufficient by the author. The gist of it is
that some things that can be done easily with normal function templates
require significant hoop jumping to be done with generic lambdas, or
can’t be done at all.The author thinks that lambdas are valuable
enough that C++ should support them just as well as normal function
templates.
Following that are quite a few examples.
answered 18 hours ago
StoryTellerStoryTeller
94.5k12191254
94.5k12191254
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54126204%2fwhat-is-the-need-of-template-lambda-introduced-in-c20-when-c14-already-has-g%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
4
What if you need to use a different template type than for the arguments or return type? And what if it's needed inside the body?
– Some programmer dude
18 hours ago
I've been told this was an interesting use case.
– Max Langhof
18 hours ago