为什么 C++20 不允许使用显式类型调用泛型 lambda?

xml*_*lmx 7 c++ lambda c++20

auto f1 = []<typename T>(T) { return T{}; };
auto f2 = []<typename T>()  { return T{}; };

int main()
{
    f1(1);     // ok
    f2<int>(); // err: expected primary-expression before 'int'
}
Run Code Online (Sandbox Code Playgroud)

为什么 C++20 不允许使用显式类型调用泛型 lambda?

use*_*670 8

调用提供模板参数的重载模板运算符 () 函数的正确语法是

auto f1 = []<typename T>(T) { return T{}; };
auto f2 = []<typename T>()  { return T{}; };

int main()
{
    f1(1);     // ok
    f2.operator ()<int>(); // Ok
}
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/z/YzY7njPGh

  • @super 与内置运算符相比,它被称为重载运算符,而不是重载函数的意义。 (3认同)
  • 只是一个挑剔,但在这种情况下,“operator()”没有重载。这只是一个模板。解决方案保持不变。 (2认同)
  • @super 它是一个重载运算符,请参见https://en.cppreference.com/w/cpp/language/operators (2认同)