使用引用参数按值捕获修改捕获的变量外部表达式?

时间:2017-06-19 01:57:52

标签: c++ c++11 lambda

当捕获hello作为引用时,我希望能够在lambda函数之外修改hello,但是下面的代码以相同的hello结尾。

#include <iostream>
#include <algorithm>
using namespace std;

int main(){
  char hello[] = {"Hello, World!"};

  auto up = [&, hello] (char c) {
      if (!isupper(c))
      {
          c = toupper(c);
      }
  };
  for_each(hello, hello + sizeof(hello), up);

  cout<<hello<<endl;
}

Hello, World!

当用c作为参考参数传递hello值时,我得到了我的预期结果。

#include <iostream>
#include <algorithm>
using namespace std;

int main(){
  char hello[] = {"Hello, World!"};

  auto up = [hello] (char& c) {
      if (!isupper(c))
      {
          c = toupper(c);
      }
  };
  for_each(hello, hello + sizeof(hello), up);

  cout<<hello<<endl;
}

cout<<hello<<endl;

HELLO, WORLD!

我的理解是当你通过值捕获hello时,up会获得hello的本地副本。暗示c是否为引用或不是hello将不会被修改。但在我的例子中,c充当了对hello的非本地副本的引用。我觉得好像缺少一些基本的参考文献。

1 个答案:

答案 0 :(得分:0)

编译时,你的lambda表达式实际上并没有捕获任何东西,所以你不妨写一下:

auto up = [] (char c) {
  if (!isupper(c))
  {
      c = toupper(c);
  }
};

但是,即使您使用[&],您认为编译如何知道chello的一部分? c无法轻易成为goodbye的一部分吗?

您可以考虑使用&c告诉编译器哪个数组c属于。

此外,您使用的是C ++,不建议使用这些原始数组。这也许是一种更好的方式:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main(){
  std::string hello = {{"Hello, World!"}};

  auto up = [hello] (char& c) { c = toupper(c); };
  for_each(hello.begin(), hello.end(), up);

  cout<<hello<<endl;
}