我知道auto my_lambda = [](auto & anything)
{
std :: cout << anything << std :: endl;
}
关键字可用于获取lambda函数以接受任何类型。例如,人们可以这样做:
my_lambda(my_int)
然后调用my_lambda(my_string)
和my_lambda(3)
一样。但是,就我的理解而言,lambda 也接受const对象。换句话说,如果我拨打auto
,const int
将替换为my_lambda
,const int
现在将接受对const
的引用。
现在,我可以通过添加auto my_lambda = [](const auto & anything)
{
std :: cout << anything << std :: endl;
}
关键字来指定:我想要const!,如下所示:
{{1}}
但是我似乎无法找到任何指定的方法:我希望它可变!有没有什么可以说服lambda函数接受对任意类型的引用,但只有可变类型?
答案 0 :(得分:2)
如果提供static_assert
类型,您可以使用std::is_const
和const
生成编译器错误。例如:
#include <iostream>
#include <type_traits>
int main()
{
auto my_lambda = [](auto & anything)
{
using input_type = std::remove_reference_t<decltype(anything)>;
static_assert(std::is_const_v<input_type> == false, "Can't pass a const.");
std::cout << anything << std::endl;
};
int i = 5;
const int j = 10;
my_lambda(i);
my_lambda(j); // error: static assertion failed: Can't pass a const.
}
答案 1 :(得分:1)
只需添加一个静态断言:
#include <iostream>
#include <type_traits>
int main()
{
auto my_lambda
{
[](auto & anything)
{
static_assert(!::std::is_const_v<::std::remove_reference_t<decltype(anything)>>);
std :: cout << anything << std :: endl;
}
};
int bar{};
my_lambda(bar);
int const foo{};
my_lambda(foo); // error
}