나는 컴파일러가 가능한 한 많은 작업을 수행하게하는 것을 좋아합니다. 간단한 클래스를 작성할 때 컴파일러는 '무료'에 대해 다음을 제공 할 수 있습니다.
- 기본 (빈) 생성자
- 복사 생성자
- 소멸자
- 할당 연산자 (
operator=
)
같은 -하지만 당신에게 비교 연산자 줄 수없는 것 operator==
또는 operator!=
. 예를 들면 다음과 같습니다.
class foo
{
public:
std::string str_;
int n_;
};
foo f1; // Works
foo f2(f1); // Works
foo f3;
f3 = f2; // Works
if (f3 == f2) // Fails
{ }
if (f3 != f2) // Fails
{ }
이것에 대한 정당한 이유가 있습니까? 멤버 별 비교를 수행하는 것이 왜 문제가됩니까? 분명히 클래스가 메모리를 할당하면 조심하고 싶지만 간단한 클래스의 경우 컴파일러 가이 작업을 수행 할 수 있습니까?
==
기본 자동 할당 ( =
) 이있는 것과 같은 방식 으로 기본 자동을 갖지 않는 것은 실수라고 지적했습니다 . (논리가 모두 적용되기 때문에 포인터에 대한 인수는 일관성 =
과 ==
, 그리고뿐만 아니라 초).