Lambda接受对任何类型的可变引用

时间:2018-03-09 15:11:47

标签: c++ lambda auto

我知道auto my_lambda = [](auto & anything) { std :: cout << anything << std :: endl; } 关键字可用于获取lambda函数以接受任何类型。例如,人们可以这样做:

my_lambda(my_int)

然后调用my_lambda(my_string)my_lambda(3)一样。但是,就我的理解而言,lambda 接受const对象。换句话说,如果我拨打autoconst int将替换为my_lambdaconst int现在将接受对const的引用。

现在,我可以通过添加auto my_lambda = [](const auto & anything) { std :: cout << anything << std :: endl; } 关键字来指定:我想要const!,如下所示:

{{1}}

但是我似乎无法找到任何指定的方法:我希望它可变!有没有什么可以说服lambda函数接受对任意类型的引用,但只有可变类型?

2 个答案:

答案 0 :(得分:2)

如果提供static_assert类型,您可以使用std::is_constconst生成编译器错误。例如:

#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
}

online compiler