Value Categories and References
Return Value Flow
A returned value can flow directly into a new object without requiring the caller to manage a separate temporary.
return value
A function can create a value and return it to the caller.
prvalue
A pure rvalue expression can initialize a named object at the call site.
Return Value Flow
return_value_flow.cpp
Replay: real traced execution (multi-file project)
#include <iostream>
#include <string>
std::string make_label(int count) {
return "item" + std::to_string(count);
}
int main() {
int count = 3;
std::string label = make_label(count);
int size = static_cast<int>(label.size());
std::cout << "label=" << label << std::endl;
std::cout << "size=" << size << std::endl;
return 0;
}
#include <iostream>
#include <string>
std::string make_label(int count) {
return "item" + std::to_string(count);
}
int main() {
int count = 1;
std::string label = make_label(count);
int size = static_cast<int>(label.size());
std::cout << "label=" << label << std::endl;
std::cout << "size=" << size << std::endl;
return 0;
}
#include <iostream>
#include <string>
std::string make_label(int count) {
return "item" + std::to_string(count);
}
int main() {
int count = 7;
std::string label = make_label(count);
int size = static_cast<int>(label.size());
std::cout << "label=" << label << std::endl;
std::cout << "size=" << size << std::endl;
return 0;
}
count ← 3
8int main() {9 int count→ 3 = 3; //@count=1, 71011 std::string label = make_label(count3);12 int size = static_cast<int>(label.size());std::string make_label(int count)
4std::string make_label(int count3) {5 return "item" + std::to_string(count3);6}label ← item3, size ← 5
11 std::string label→ item3 = make_label(count3);12 int size→ 5 = static_cast<int>(labelitem3.size());1314 std::cout << "label=" << labelitem3 << std::endl;15 std::cout << "size=" << size5 << std::endl;16 return 0;17}outputlabel=item3 size=5
count ← 1
8int main() {9 int count→ 1 = 1;1011 std::string label = make_label(count1);12 int size = static_cast<int>(label.size());std::string make_label(int count)
4std::string make_label(int count1) {5 return "item" + std::to_string(count1);6}label ← item1, size ← 5
11 std::string label→ item1 = make_label(count1);12 int size→ 5 = static_cast<int>(labelitem1.size());1314 std::cout << "label=" << labelitem1 << std::endl;15 std::cout << "size=" << size5 << std::endl;16 return 0;17}outputlabel=item1 size=5
count ← 7
8int main() {9 int count→ 7 = 7;1011 std::string label = make_label(count7);12 int size = static_cast<int>(label.size());std::string make_label(int count)
4std::string make_label(int count7) {5 return "item" + std::to_string(count7);6}label ← item7, size ← 5
11 std::string label→ item7 = make_label(count7);12 int size→ 5 = static_cast<int>(labelitem7.size());1314 std::cout << "label=" << labelitem7 << std::endl;15 std::cout << "size=" << size5 << std::endl;16 return 0;17}outputlabel=item7 size=5