왜 이것이 기본 생성자를 호출합니까?


80
struct X
{
    X()    { std::cout << "X()\n";    }
    X(int) { std::cout << "X(int)\n"; }
};

const int answer = 42;

int main()
{
    X(answer);
}

이 중 하나를 인쇄 할 것으로 예상했을 것입니다.

  • X(int)때문에 X(answer);에서 캐스트로 해석 될 수 intX, 또는
  • X(answer);변수의 선언으로 해석 될 수 있기 때문에 전혀 없습니다 .

그러나 인쇄X()X(answer); 되고 기본 생성자를 호출하는 이유를 모르겠습니다 .

보너스 포인트 : 변수 선언 대신 임시로 변경하려면 무엇을 변경해야합니까?


1
X ((int) 답변); 그러나 올바른 결과를 생성합니다.
Inisheer

2
@JTA 그리고 마지막으로는, X(int(answer));이 함수 선언 : 때문에, 아무것도 인쇄되지 않습니다
fredoverflow

1
X (답변); 변수의 선언으로 해석 될 수 있습니다. 이 선언은 또한 정의가 될 것이며 기본 생성자의 실행을 트리거합니다.
David Rodríguez-dribeas

6
@ 데이비드 double(expresso);당신은 당신을 위해 단지 선언이 이동)
fredoverflow

2
@FredOverflow : 나는 필요합니다 정의를 나는 ... 효과 느낌이 없다하고 있기 때문에, 그것을 사용하는
dribeas - 데이비드 로드리게스

답변:


73

X (답변); 변수의 선언으로 해석 될 수 있습니다.

귀하의 답변은 여기에 숨겨져 있습니다. 변수를 선언하면 기본 ctor를 호출합니다 (POD가 아닌 경우 및 모든 항목).

편집시 : 임시를 얻으려면 몇 가지 옵션이 있습니다.


4
static_cast<X>(answer)그것이 심지어 오래된에 의해 권장 - "가장 C ++"대답은 느낌 GCC 문서 를 rvalue를 강제하는 방법으로합니다.
Kerrek SB

중괄호 이니셜 라이저도 복사본을 생성하지 않을까요?
rubenvb

@rubenvb : 왜 그럴까요? 그것은 단지 멋진 새로운 X(answer)말법이며 배우 호출을 보장합니다.
Xeo

@Xeo : 중괄호 이니셜 라이저 구문은 인수를 값으로 사용하기 때문에? (<-물음표 참고)
rubenvb

4
@KerrekSB하지만 확실히 C ++ 11 이전에요? 이제 표준 답은 X{answer}.
Konrad Rudolph

66

괄호는 선택 사항입니다. 당신이 말한 내용은와 동일 X answer;하며 선언문입니다.


9

X 유형의 변수를 선언하려면 다음과 같이해야합니다.

X y(answer);

1
그는 그것을 X(int)배우 라고 부르는 방법을 묻지 않았습니다 .
Xeo

네,하지만 나는 그것이 그가 :) 할, 표준 일이라고 작은 느낌이
huysentruitw

6
@WouterH : 사실, Fred를 알면 가능성이 낮습니다. 그는 C ++ 표준의 어두운 구석을 탐색하고 그것을 이해하려고 노력하는 사람들 중 한 명입니다. 특정 RPG에서 그는 이미 그의 정신 포인트를 잃은 것이다)
마티유 M.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.