2013-04-12 2 views
3

const char*에서 std::string으로의 암시 적 변환이 왜 후자의 경우에 작동하지 않습니까? 가능한 경우 C++ 표준에 대한 참조를 링크하십시오.배열 초기화 자 목록의 암시 적 변환

변형 1

struct Foo { 
    Foo(const char* a) {} 
}; 

int main() { 
    // works well for a "const char*" accepting constructor 
    Foo* foo = new Foo[1] { "a" }; 
} 

변형 2 :

struct Foo { 
    Foo(std::string a) {} 
}; 

int main() { 
    // could not convert from "const char*" to "Foo" 
    Foo* foo = new Foo[1] { "a" }; 
} 
+0

암시 적 캐스트와 같은 것은 존재하지 않습니다. 캐스트 (명시 적 유형 변환) 및 유형 병합 (암시 적 유형 변환)이 있으며, 어느 것을 결정합니다. –

+0

페이지 이름을 확인하십시오 : http://en.cppreference.com/w/cpp/language/implicit_cast – Hertz

답변

6

최대 하나의 사용자 정의 전환율 사용자 정의 변환 시퀀스 (12.3p4)에서 허용된다.

당신은 그것을 작동하도록 괄호의 추가 레벨을 사용할 수 있기 때문에 a bug in clang의 그것이 실제로 호출되지 않습니다 경우에도 기본 생성자 Foo::Foo()을 가지고 Foo이 필요

Foo* foo = new Foo[1] { {"a"} }; 

하는 것으로.

+0

음 ... 좋아요, g ++에서 잘 작동하지만 clang에서는 잘 작동하지 않습니다 ([LWS 예] (http : //liveworkspace.org/code/4jHHSh$0)) – soon

+0

그래서 누가 잘못 되었나요? g ++ 또는 clang? – balki

+1

@balki clang이 깨졌습니다. 간단한 해결 방법이 있습니다 (기본 생성자 추가). 지금 버그 신고. – ecatmur