EzoeRyou/cpp-intro

038-move-semantics.md の「コピーとムーブの判別」でobjectがlambdaにcaptureされていない

Opened this issue · 0 comments

再現コード

#include "../all.h"

void f(const int &){
  std::cout << "lvalue\n";
}
void f(const int &&){
  std::cout << "rvalue\n";
}

int main(){
  int object {};

  f(object);
  f(object + object);
  f([&]{ return object; }());
  f(std::move(object));
}

実行結果

$ g++ -std=c++17 -Wall lvalue-and-rvalue.cpp
lvalue-and-rvalue.cpp: In lambda function:
lvalue-and-rvalue.cpp:15:16: error: ‘object’ is not captured
   15 |   f([]{ return object; }());
      |                ^~~~~~
lvalue-and-rvalue.cpp:15:6: note: the lambda has no capture-default
   15 |   f([]{ return object; }());
      |      ^
lvalue-and-rvalue.cpp:11:7: note: ‘int object’ declared here
   11 |   int object {};
      |       ^~~~~~

おまけ

https://twitter.com/TartanLlama/status/1283816537778982914 を思い出した。
試しに objectconstexpr にしたらコンパイルされた。