2014-11-30 3 views
0

제 질문은 간단합니다. 실제로 이에 대한 정보는 찾을 수 없습니다. 할당 연산자를 복사 (이동)해야 할당자가 구성되어야합니까?할당 연산자에 대한 요구 사항

+0

AFAIK는 기본적으로 함수 서명이 일치해야한다는 요구 사항이 없으므로 컴파일러에서 선택합니다. 더 흥미로운 점은 어떻게 구조화되지 않은 객체에 할당하고자하는 것입니까? 생성자에서 연산자를 호출 하시겠습니까? – luk32

+0

조금 더 자세히 알려주세요 – Fiju

+1

'a = b'에서'a'가 유효한 객체 일 필요가 있다는 것을 의미합니까? 네,'a'와'b' 모두 유효한 객체 여야합니다. – Shoe

답변

1

T object(object_to_copy) 또는 T object = object_to_copy이 새 개체를 구성하기 때문에 이미 존재할 필요가 없습니다. 이것은 C++ 표준, 12.8/2 절에 문서화되어 있습니다.

위의 복사 구성과 다른 컨텍스트에서 사용되는 일반 할당 연산자는 대상 개체가 이미 존재해야합니다 (즉, 구성되어야 함). 이것은 표준의 13.5 절에서 쉽게 추론 할 수 있습니다.

+0

@jrok 아니, 아니야, 내 첫 단락이 그것에 대해 아주 분명했으면 좋겠다. 두 번째 문장에 "어느"를 추가하여 귀하가 발견 한 모호성을 제거합니다. – Christophe

0

질문에서 얻을 수있는 것은 a = b에 있는지, a을 완전히 구성해야하는지 묻고 싶습니다.

이 경우 대답은 예입니다. a은 할당 연산자가 호출되기 전에 완전히 구성된 개체 여야합니다. 할당은 객체와 일부 임의의 원시 비트가 아닌 두 객체 사이에서만 의미가 있기 때문입니다.

0

다른 답변과 달리 객체를 구성하기 전에 operator=을 호출 할 수 있습니다. 다음 코드는 유효하고 정의되지 않은 동작을 유발하지 않습니다.

#include <iostream> 

class A 
{ 
    public: 
    A(){ 
     std::cout << "A()\n"; 
     *this = *this; 
    } 
    A(const A& a) { std::cout << "A(const A& a)\n"; } 
    A& operator=(const A& a) { std::cout << "operator=\n"; return *this; } 
}; 

int main() 
{ 
    A a; 
    return 0; 
} 

출력 : 그것은 어떤 이해가되지 않습니다 물론

A() 
operator= 

. 그러나, 질문은 무언가가 허용되는지 아닌지, 내 대답은 그렇습니다. 분명히 생성자가 끝나기 전에 operator=이 호출되고 그러한 생성을 작성할 수 있습니다.

+2

클래스는 초기화 프로그램 목록이 실행될 때 완전히 구성됩니다. 즉, 프로그램 흐름이 생성자에서 열기'{'에 도달 할 때까지 객체가 생성됩니다. 생성자의 중괄호 사이의 코드는 'post-construction' –

+0

Dang으로 간주되어야합니다. 나는 대답을 지울 것이지만 표준에서 따옴표를 얻을 수 있습니까? 아니면 어디에서 인용문을 찾을 수 있습니까? 나 혼자만. – luk32

+0

생성자는 모든 멤버 함수를 호출 할 수 있습니다. 이를 확인하기 위해 표준을 언급 할 필요는 없습니다. –