Зараз я вивчаю С ++ і намагаюся уникати шкідливих звичок. З того, що я розумію, кланг-охайний містить багато "найкращих практик", і я намагаюся дотримуватися їх якнайкраще (хоча я не обов'язково розумію, чому вони ще вважаються хорошими), але я не впевнений, чи зрозумійте, що тут рекомендується.
Я використовував цей клас з підручника:
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(тому що він копіюється двічі).
Отже, два питання:
- Чи правильно я зрозумів, що тут відбувається?
- Чи є перевага використання
std::moveпереходу через посилання та просто дзвінкаm_name{name}?
std::string_viewта SSO.
clang-tidy, що це чудовий спосіб заручитися непотрібними мікрооптимізаціями за рахунок читабельності. Питання, яке слід задати тут, перш ніж все інше, полягає в тому, скільки разів ми насправді називаємо Creatureконструктор.
Creature c("John");робить додаткову копію