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

count
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;
}
  1. 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());
  2. std::string make_label(int count)

    4std::string make_label(int count3) {5    return "item" + std::to_string(count3);6}
  3. 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
  1. count ← 1

    8int main() {9    int count→ 1 = 1;1011    std::string label = make_label(count1);12    int size = static_cast<int>(label.size());
  2. std::string make_label(int count)

    4std::string make_label(int count1) {5    return "item" + std::to_string(count1);6}
  3. 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
  1. count ← 7

    8int main() {9    int count→ 7 = 7;1011    std::string label = make_label(count7);12    int size = static_cast<int>(label.size());
  2. std::string make_label(int count)

    4std::string make_label(int count7) {5    return "item" + std::to_string(count7);6}
  3. 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