2012-11-04 2 views
8
void f(int count, ...){ 
    //whatever 
} 

struct somestruct{ 
    size_t a, b, c; 
}; 

int main() { 
    somestruct s; 
    f(1, s); //what is actually passed? 
} 

전체 struct이 복사되어 스택에 전달됩니까? 그렇다면 복사 생성자가 호출됩니까? 포인터가 전달 되었습니까? 이거 안전한가요?구조체를 vararg 함수에 전달하면 어떻게됩니까?

+0

C++에 대해 질문해야합니다. C에는 복사 생성자가 없습니다. –

답변

2

당신이 좌변을 전달하는 경우 예,를 rvalue 변환에 좌변은으로 개체를 복사하는 복사 생성자를 호출하는 의미 할 것이다 새 사본을 인수로 전달하십시오.

+0

글쎄 ...하지만 타입을 쉽게 복사 할 수 있어야한다는 제약이 있다면 (그렇지 않으면'g ++'는 에러를 출력한다), 그러면 당신의 응답과 빌즈는 동등한가 ... 그렇지 않은가? –

+0

@LorenzoPistone no. 카피 생성자는 삭제되거나 비공개 일 수있다. 그것은 반드시 사소한 것은 아니지만 부름을 부당하게 만들 것입니다. –

1

void f(...)은 비트 단위 복사를 사용합니다. somestruct에는 C++ 빌드 유형 만있는 기본 생성자 또는 복사 생성자가 생성되지 않습니다.

Is this safe? 

예, 이것은 완전히 안전합니다.

나는 당신에게 '내부 C++ 객체 모델'을 참조 할 것 chapter 2 The Semantics of Constructors

+0

참고 자료가 있으십니까? –

+0

구조체가 쉽게 복사 가능해야한다는 것을 알았습니다. –

+0

@LorenzoPistone : 구조체는 POD 유형이어야합니다. –

관련 문제