Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
401 views
in Technique[技术] by (71.8m points)

c++ - Familiar template syntax for generic lambdas

For c++20 it is proposed to add the following syntax for generic lambdas p0428r2.pdf

auto f = []<typename T>( T t ) {};

But the current implementation in gcc 8 did not accept the following instantiation:

f<std::string>("");

Is that a implementation bug in gcc or a missing language feature? I know we talk about a proposal and not a approved specification.

Complete example ( with comparison to template function syntax ):

template <typename T> void n( T t ) { std::cout << t << std::endl; }

auto f = []<typename T>( T t ) { std::cout << t << std::endl; };

int main()
{
    f<std::string>("Hello");  // error!
    n<std::string>("World");
}

complains with following error:

main.cpp:25:22: error: expected primary-expression before '>' token f("Hello");

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

The result of a lambda expression is not a function; it is a function object. That is, it is a class type that has an operator() overload on it. So this:

auto f = []<typename T>( T t ) {};

Is equivalent to this:

struct unnamed
{
  template<typename T>
  void operator()(T t) {}
};

auto f = unnamed{};

If you want to explicitly provide template arguments to a lambda function, you have to call operator() explicitly: f.operator()<template arguments>(parameters);.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...