C++では、std::stringは動的文字列、つまり実行時に長さが変化する可能性のある文字列を表すクラスである。

一方、&strは文字列スライスへの参照である。文字列スライスは文字列の一部分で、スライスの最初の文字へのポインタと長さで表すことができます。std::stringとは異なり、文字列スライスは指し示すメモリを所有するのではなく、基礎となるstd::stringまたは別の文字列スライスから借用します。このため、文字列スライスはstd::stringオブジェクトよりもはるかに軽量です。

要するに、文字列を保存して操作する必要がある場合は、std::stringを使用してください。文字列の一部を参照するだけなら、&strを使う。
In C++, std::string is a class that represents a dynamic string, i.e., a string of characters that can change in length during runtime. std::string objects store the characters in a contiguous block of memory, along with some additional metadata such as its length.

On the other hand, &str is a reference to a string slice. A string slice is a portion of a string that can be represented by a pointer to the first character of the slice and a length. Unlike std::string, string slices do not own the memory they point to, but rather borrow it from an underlying std::string or another string slice. This makes string slices much lighter-weight than std::string objects.

In short, if you need to store and manipulate a string of characters, use std::string. If you just need to refer to a portion of a string, use &str.