[C++] 왜 C ++은 구조체 내에 배열의 멤버 와이즈 할당을 지원합니까?


Answers

할당 연산자와 관련하여 C ++ 표준은 다음과 같이 말합니다 (C ++ 03 §5.17 / 1).

할당 연산자가 여러 개 있습니다 ... 모두 수정 가능한 왼쪽 값을 왼쪽 피연산자로 사용해야합니다.

배열은 수정 가능한 좌변 치가 아닙니다.

그러나 클래스 유형 객체에 대한 할당은 특별히 정의됩니다 (5.17 / 4 절).

클래스의 객체에 대한 할당은 복사 할당 연산자에 의해 정의됩니다.

그래서 우리는 클래스에 대해 암시 적으로 선언 된 복사 할당 연산자가 무엇인지 알아 봅니다 (§12.8 / 13).

클래스 X에 대한 암시 적으로 정의 된 복사 할당 연산자는 하위 객체의 구성원 단위 할당을 수행합니다. ... 각 하위 객체는 해당 유형에 적합한 방식으로 할당됩니다.
...
- 서브 객체가 배열 인 경우 각 요소는 요소 유형에 적합한 방식으로 할당됩니다
...

따라서 클래스 유형 객체의 경우 배열이 올바르게 복사됩니다. 사용자 선언 복사 할당 연산자를 제공하는 경우이를 활용할 수 없으므로 배열을 요소별로 복사해야합니다.

추론은 C (C99 §6.5.16 / 2)에서 유사합니다.

대입 연산자는 왼쪽 피연산자로서 수정 가능한 좌변 치를 가져야한다.

§6.3.2.1 / 1 :

수정 가능한 lvalue는 배열 형식이없는 lvalue입니다 ... [다른 제약 조건을 따르십시오]

C에서 할당은 C ++ (§6.5.16.1 / 2)보다 훨씬 간단합니다.

단순 대입 (=)에서는 오른쪽 피연산자의 값이 대입 식의 유형으로 변환되고 왼쪽 피연산자로 지정된 객체에 저장된 값을 대체합니다.

구조체 타입 객체의 할당을 위해서는 왼쪽 피연산자와 오른쪽 피연산자가 같은 유형이어야하므로 오른쪽 피연산자의 값이 왼쪽 피연산자에 복사됩니다.

Question

배열의 구성원 단위 지정이 지원되지 않으므로 다음과 같이 작동하지 않습니다.

int num1[3] = {1,2,3};
int num2[3];
num2 = num1; // "error: invalid array assignment"

방금 사실로 받아 들였고, 언어의 목표는 개방형 프레임 워크를 제공하고 사용자가 배열을 복사하는 것과 같은 것을 구현하는 방법을 결정하도록하는 것이라고 생각했습니다.

그러나 다음과 같이 작동합니다.

struct myStruct {int num[3];};
myStruct struct1={{1,2,3}};
myStruct struct2;
struct2 = struct1;

배열 num[3]struct1 의 인스턴스에서 struct1 의 인스턴스로 멤버별로 지정됩니다.

구조체에 대해 구성원의 배열 할당이 지원되는 이유는 무엇입니까?

편집 : 스레드에서 Roger Pate 의 코멘트 std :: string in struct - 복사 / 할당 문제? 대답의 일반적인 방향을 가리키는 것처럼 보이지만 나는 그것을 스스로 확인하기에 충분하지 않습니다.

편집 2 : 많은 우수한 응답. 필자는 루터 블리셋 (Luther Blissett)을 선택했다. 그 이유는 필자가 행동의 철학적 또는 역사적 근거에 대해 궁금해했기 때문이다. 그러나 관련 사양 문서에 대한 James McNellis 의 참고 문헌도 유용했다.




알아요, C / C ++의 전문가들입니다. 하지만 이것이 주된 이유라고 생각했습니다.

num2 = num1;

여기에서는 허용되지 않는 배열의 기본 주소를 변경하려고합니다.

물론 struct2 = struct1;

여기서, 오브젝트 struct1은 다른 오브젝트에 지정됩니다.