C++と色々

主にC++やプログラムに関する記事を投稿します。

ジェネリックラムダ

C++14で実装されるジェネリックラムダの引数の型autoは、テンプレート引数と同じ型推論が行われます。なので引数の右辺値参照が左辺値参照にもなります。

#include <iostream>
#include <type_traits>
#include <utility>

int main()
{
  auto lam = [](auto&& val)
  {
    using type = decltype(val);
    std::cout << "rvalue : " << std::is_rvalue_reference<type>::value << std::endl;
    std::cout << "lvalue : " << std::is_lvalue_reference<type>::value << std::endl;
  };

  int x = 42;
  lam(x);
  std::cout << "------" << std::endl;
  lam(std::move(x));
}

実行結果

rvalue : 0
lvalue : 1
------
rvalue : 1
lvalue : 0

0