2017-09-29 12 views
6

를 호출합니다. 그러나 다음 코드 :기본 인수를 허용하는 생성자는 아무도 객체 <code>A</code>를 구성 할 수 없습니다해야 <code>Key</code>의 생성자이 비공개 I 클래스</p> <pre><code>class A { public: class Key { Key() {} Key(Key const &) {} }; A(Key key, int a = 5) {} }; </code></pre> <p>이 개인 방법을

int main() { 
    A a(A::Key()); // this compiles !!! 
    A a2(A::Key(), 5); // this doesn't 
    // somehow defaulting the argument causes the private constructor 
    // to be OK - no idea why 
    return 0; 
} 

내 생성자 int a에 대한 기본 인수를 사용함으로써, 컴파일러는 행복하게 개인 있다는 사실에도 불구하고 A::Key() 내 사용을 컴파일합니다. a에 명시 적으로 값을 지정하면 컴파일러는 개인 생성자와 오류를 사용하려고한다는 것을 올바르게 인식합니다. 왜 이런거야? 거기에 첫 번째 예제뿐만 아니라 오류가 컴파일러 강제로 someway 있습니까?

라이브 예제는 here을 참조하십시오.

답변

7

이것은 가장 까다로운 구문 분석 때문입니다.

A a(A::Key()); 

A 이름 a을 만들고 임시 A::Key로를 구성하지 않습니다. A을 반환하고 A::Key을 반환하는 함수에 대한 명명되지 않은 포인터를 사용하는 함수 a을 만듭니다.

당신이 그것에 한 쌍의 괄호를 추가 할 경우 당신은 당신이 개인 생성자를 호출하려고하는 컴파일러 오류를

A a((A::Key())); 

을 얻을 것이다. 또는 당신은 그것을 명확하게하는 제복을 입은 초기화를 사용할 수 있으며 내가 전에이 곳 ... 내가 한 번 매 5 년마다로 실행하고 있기 때문에에 의해 어리둥절 나는 그런 것들 중 하나를 만났다고 알고 컴파일 오류를

A a(A::Key{}); 
+1

의 원인이됩니다 나는 오랫동안 그것을 보지 못했습니다 ... 도움을 주셔서 감사합니다. –

+1

@R_Kapp 문제 없습니다. 기꺼이 도와주세요. – NathanOliver