通用 lambda 可以没有参数吗?
Can a generic lambda have no arguments?
首先,我知道我可以使用模板 class/functor,但这不是我想要的。
这是 lambda:
auto lambda = [] (auto var) {
decltype(var) x;
//do stuff with x but nothing with var
};
问题是我收到警告 C4100(未引用的形式参数)。我也知道我可以使用技巧,例如禁用警告并在 lambda 之后再次启用它或使用 UNREFERENCED_PARAMETER 等宏,但这是作弊。
有什么办法可以做到吗?
理想的代码如下所示:
template <typename T>
auto lambda = [] () {
T x;
//do stuff with x
};
如果您真的不需要参数,只需将其包装在 void
:
auto lambda = [](auto var) {
(void)var; // now we used it - more or less
decltype(var) x;
/* whatever else */
};
这不是 lambda 的用途,也没有语法可以做到这一点(除了破解警告之外)。
写个合适的函数模板就好了。并非所有东西都必须是 lambda。
不,通用 lambda 不能没有参数,因为它没有可从中推导出类型的参数。您将不得不使用回退模板仿函数。
不要使用 lambda:
template<typename T>
struct Functor
{
void operator () () { T var; ... }
}
lambda 就是编译器生成的仿函数。
事实上,在 C++14 中,您可以完全使用您想要的语法创建 "template lambdas",但仅限于命名空间范围内:
// (1)
template <typename T>
auto l = [] () {
T x;
};
int main() {
l<int>();
}
它不是通用 lambda,它是一个变量模板,但您甚至可以创建通用模板 lambda:
template <typename T>
auto l = [] (auto y) {
T x = 42;
std::cout << x + y << std::endl;
};
但是有一个缺点:在目前的编译器中似乎只有 Clang 支持这个。
Update:因为这只能在命名空间范围内完成,如果你的 lambda 没有参数,或者没有 auto
参数(也就是说,它是不是通用的),它可以被一个函数替换,甚至不需要任何 C++11 特性,更不用说 C++14 了。如果这样的 lambda 有捕获,它们只能捕获全局变量,因此相应的函数可能只使用相同的变量或其副本。感谢@JasonR 指出这一点:
// effectively the same as (1)
template <typename T>
void l() {
T x;
}
首先,我知道我可以使用模板 class/functor,但这不是我想要的。
这是 lambda:
auto lambda = [] (auto var) {
decltype(var) x;
//do stuff with x but nothing with var
};
问题是我收到警告 C4100(未引用的形式参数)。我也知道我可以使用技巧,例如禁用警告并在 lambda 之后再次启用它或使用 UNREFERENCED_PARAMETER 等宏,但这是作弊。
有什么办法可以做到吗?
理想的代码如下所示:
template <typename T>
auto lambda = [] () {
T x;
//do stuff with x
};
如果您真的不需要参数,只需将其包装在 void
:
auto lambda = [](auto var) {
(void)var; // now we used it - more or less
decltype(var) x;
/* whatever else */
};
这不是 lambda 的用途,也没有语法可以做到这一点(除了破解警告之外)。
写个合适的函数模板就好了。并非所有东西都必须是 lambda。
不,通用 lambda 不能没有参数,因为它没有可从中推导出类型的参数。您将不得不使用回退模板仿函数。
不要使用 lambda:
template<typename T>
struct Functor
{
void operator () () { T var; ... }
}
lambda 就是编译器生成的仿函数。
事实上,在 C++14 中,您可以完全使用您想要的语法创建 "template lambdas",但仅限于命名空间范围内:
// (1)
template <typename T>
auto l = [] () {
T x;
};
int main() {
l<int>();
}
它不是通用 lambda,它是一个变量模板,但您甚至可以创建通用模板 lambda:
template <typename T>
auto l = [] (auto y) {
T x = 42;
std::cout << x + y << std::endl;
};
但是有一个缺点:在目前的编译器中似乎只有 Clang 支持这个。
Update:因为这只能在命名空间范围内完成,如果你的 lambda 没有参数,或者没有 auto
参数(也就是说,它是不是通用的),它可以被一个函数替换,甚至不需要任何 C++11 特性,更不用说 C++14 了。如果这样的 lambda 有捕获,它们只能捕获全局变量,因此相应的函数可能只使用相同的变量或其副本。感谢@JasonR 指出这一点:
// effectively the same as (1)
template <typename T>
void l() {
T x;
}