나는 지금 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하기 때문에 영향을주지 않습니다 nameA는 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}있습니까?
clang-tidy가독성을 희생하면서 불필요한 마이크로 최적화에 집착 할 수있는 좋은 방법임을 발견했습니다 . 여기서 물어볼 질문은 무엇보다 먼저 생성자를 실제로 몇 번 호출 하는가 Creature입니다.
Creature c("John");추가 사본합니다