#include<string>
#include<iostream>
std::string add_strings(std::string str1, std::string str2){
std::string result = str1 + str2;
std::cout << "In : &result(std::string) : " << &result << std::endl;
return result;
}
int main(){
std::string in_str1{"Hello"};
std::string in_str2{" World!"};
std::string result_str = add_strings(in_str1,in_str2);
std::cout << "Out : &result_str(std::string) : " << &result_str << std::endl;
std::cout << "result_str : " << result_str << std::endl;
}
我发现一些解释说编译器将默认的按值返回转换为按引用返回,但我想知道这是否正确。
这是因为命名返回值优化,NRVO。
result
中的add_strings()
变量是直接在内存中result_str
所在的位置创建的,因此在这种情况下,当您return result;
时,不会进行复制或移动。
我找到了一些解释,告诉编译器将默认的按值返回转换为按引用返回
它是按值返回,但由于函数中的所有路径都通向
return result;
,因此实际的副本被省略。只产生了一根刺,而不是两根。