当捕获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的非本地副本的引用。我觉得好像缺少一些基本的参考文献。
答案 0 :(得分:0)
编译时,你的lambda表达式实际上并没有捕获任何东西,所以你不妨写一下:
auto up = [] (char c) {
if (!isupper(c))
{
c = toupper(c);
}
};
但是,即使您使用[&]
,您认为编译如何知道c
是hello
的一部分? 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;
}