再来看一段示例代码:
#include<iostream>
#include<functional>
#include<string>
using namespace std;
void bar(std::string&&str){
printf("String address %p in bar A, str %sn", &str, str.c_str());
string strs = std::move(str);
printf("String address %p in bar B, str %s, strs %sn", &str, str.c_str(), strs.c_str());
}
std::function<void()> bar_bar(std::string &&str) {
auto funf = [&str]() {
printf("String address %p (foo lambda) F, stra %sn", &str, str.c_str());
};
return funf;
}
std::function<void()> foo(std::string &&str) {
printf("String address %p in foo A, str %sn", &str, str.c_str());
// auto funa = [str]() {
// printf("String address %p (foo lambda) A, str %sn", &str, str.c_str());
// bar(str);
// };
// funa();
//
// auto funb = [str]() {
// printf("String address %p (foo lambda) B, str %sn", &str, str.c_str());
// bar(std::move(str));
// };
// funb();
// auto func = [str]() mutable {
// printf("String address %p (foo lambda) C, str %sn", &str, str.c_str());
// bar(str);
// };
// func();
auto fund = [str]() mutable {
printf("String address %p (foo lambda) D, str %sn", &str, str.c_str());
bar(std::move(str));
};
fund();
auto fune = [&str]() {
printf("String address %p (foo lambda) E, str %sn", &str, str.c_str());
bar(std::move(str));
};
fune();
std::string stra = "testa";
return bar_bar(std::move(stra));
}
int main(){
std::string str = "test";
printf("String address %p in main A, str %sn", &str, str.c_str());
auto funcg = foo(std::move(str));
printf("String address %p in main B, str %sn", &str, str.c_str());
funcg();
return 0;
}
上面这段代码的输出如下:
Stringaddress0x7ffc9fe7c5c0 in main A, strtest
Stringaddress0x7ffc9fe7c5c0 in foo A, strtest
Stringaddress0x7ffc9fe7c540 (foo lambda) D, strtest
Stringaddress0x7ffc9fe7c540 in barA, strtest
Stringaddress0x7ffc9fe7c540 in barB,str, strstest
Stringaddress0x7ffc9fe7c5c0 (foo lambda) E, strtest
Stringaddress0x7ffc9fe7c5c0 in barA, strtest
Stringaddress0x7ffc9fe7c5c0 in barB,str, strstest
Stringaddress0x7ffc9fe7c5c0 in main B,str
Stringaddress0x7ffc9fe7c560 (foo lambda) F, stra����
在函数 foo() 中定义的 funa 及对 funa 的调用被注释掉了,这是因为这段代码会导致编译失败,具体的错误信息如下:
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/DemoTest.d" -MT"src/DemoTest.o" -o "src/DemoTest.o" "../src/DemoTest.cpp"
../src/DemoTest.cpp: In lambda function:
../src/DemoTest.cpp:25:12: error: cannot bind rvalue reference of type ‘std::__cxx11::string&& {aka std::__cxx11::basic_string<char>&&}' to lvalue of type ‘const string {aka const std::__cxx11::basic_string<char>}'
bar(str);










