私は現在C ++を学んでおり、悪い習慣を身につけないようにしています。私が理解していることから、clang-tidyには多くの「ベストプラクティス」が含まれており、可能な限り最善を尽くすように努めていますが(なぜそれらがまだ優れていると見なされているのかは必ずしも理解していません)、私は確信が持てませんここで何が推奨されているかを理解してください。
私はチュートリアルからこのクラスを使用しました:
class Creature
{
private:
std::string m_name;
public:
Creature(const std::string &name)
: m_name{name}
{
}
};
これは、参照ではなく値で渡し、を使用する必要があるというclang-tidyからの提案につながりますstd::move。実行するとname、参照を作成するように提案され(毎回コピーされないようにするため)、警告が表示さstd::moveれるので影響がないためname、const削除する必要があります。
警告を受け取らない唯一の方法は、const完全に削除することです。
Creature(std::string name)
: m_name{std::move(name)}
{
}
唯一の利点はconst元の文字列をいじるのを防ぐことだったので、これは理にかなっているように見えます(値で渡したため発生しません)。しかし、私はCPlusPlus.comで読みました:
ただし、標準ライブラリでは、移動は移動元のオブジェクトが有効ですが指定されていない状態のままであることを意味します。つまり、そのような操作の後、移動されたオブジェクトの値は破棄されるか、新しい値が割り当てられるだけです。それ以外の方法でアクセスすると、未指定の値が生成されます。
このコードを想像してみてください:
std::string nameString("Alex");
Creature c(nameString);
nameString値で渡されるため、コンストラクター内でstd::moveのみ無効化さnameれ、元の文字列には触れません。しかし、これの利点は何ですか?とにかくコンテンツが一度だけコピーされるようです-を呼び出すときに参照m_name{name}渡しする場合、渡すときに値渡しする場合(そして移動される場合)。これは、値を渡して使用しないよりも優れていることを理解していますstd::move(2回コピーされるため)。
したがって、2つの質問:
- ここで何が起こっているのかを正しく理解しましたか?
std::move参照渡しを使用して呼び出すだけのメリットはありm_name{name}ますか?
std::string_viewん。合格とSSOについても説明しています。
clang-tidy、読みやすさを犠牲にして、不要なマイクロ最適化に取り付かれるのに最適な方法であることがわかりました。ここで質問するのは、何よりもまず、実際にCreatureコンストラクタを呼び出す回数です。
Creature c("John");、追加のコピーを作成