2010-03-14 6 views
2

C++은 몇 레벨 깊이의 오브젝트에 대한 암시 적 변환/생성을 어떻게 결정합니까? C++, 어떻게 암시 적 변환/생성자가 결정됩니까?

struct A {}; 
struct B: A {}; 
struct C { operator B() { return B(); } }; 

void f(A a) {} 

int main(void) 
{ 
    f(C()); 
} 

이 가능한 모든 변환의 트리를 생성하고 적절한 터미널을 선택 하는가 : 예를 들어 ? 다른 것? 감사합니다

+1

몇 가지 편집 가능한 코드를 게시하십시오. 컴파일하면 질문에 대한 답을 줄 수도 있습니다. –

답변

4

다른 접근의 모두 거기에 아마 유도 - 투 -베이스 : B 내지 A). 일치하지 않는 인수가있는 호출은 0 개 또는 하나의 사용자 정의 변환이 필요할 때 성공합니다. 다른 변환 (내장 또는 사용자 정의)이 성공하면 가능한 모든 방법이 필요한 변환 수/종류가 동일하면 호출이 모호하며 컴파일러에서 진단을 내 보내야합니다.

컴파일러가 구현하는 방법은 표준에 의해 지정되지 않습니다.

+0

감사합니다. 우선 순위, 사용자 정의 변환, C-> A 또는 생성자 C (A)가 무엇인지 알고 있습니까? – Anycorn

+0

@aaa : 나는 여기 깊이 내고있다. 그러나 TTBOMK, 두 개의 사용자 정의 변환이 가능하다면 호출이 모호하며 코드가 컴파일되어서는 안된다. – sbi

+1

@aaa, 전체 코드를 알려주십시오. 당신의 코드에서는 오직 변환 함수 만 존재하고'C (A)'생성자는 없다. 우리의 분석에 따르면 적어도 주어진 코드는 잘되고 표준은이를 준수하고 있습니다. 이제'C (A)'는 어떨까요? 나는 여기에 그런 생성자를 보지 못했다. –

2

표준은 이것을 지정하지 않습니다. 결과 만 지정합니다. 각기 다른 컴파일러 벤더는 정확한 결과를 제공하는 한 원하는 방식으로이를 구현할 수 있습니다.

그래서 f()에 대한 호출이 변환 한 사용자 정의 변환 (B-C)와 하나의 내장 변환 (필요 거기