캐스트 연산자가 명시적일 수 있습니까?


84

생성자에있어서 키워드를 추가 explicit하면 프로그래머가 처음 의도하지 않았을 때 열광적 인 컴파일러가 객체를 생성하지 못합니다. 캐스팅 오퍼레이터도 그러한 메커니즘을 사용할 수 있습니까?

struct Foo
{
    operator std::string() const;
};

여기에, 예를 들어, 나는 캐스트 수 있도록하고 싶습니다 Foostd::string,하지만 난 암시 적으로 발생하는 이러한 캐스트를 원하지 않는다.

답변:


101

예 그리고 아니오.

사용중인 C ++ 버전에 따라 다릅니다.

  • C ++ 98 및 C ++ 03은 explicit형식 변환 연산자를 지원하지 않습니다.
  • 하지만 C ++ 11은 그렇습니다.

예,

struct A
{
    //implicit conversion to int
    operator int() { return 100; }

    //explicit conversion to std::string
    explicit operator std::string() { return "explicit"; } 
};

int main() 
{
   A a;
   int i = a;  //ok - implicit conversion 
   std::string s = a; //error - requires explicit conversion 
}

로 컴파일 g++ -std=c++0x하면 다음 오류가 발생합니다.

prog.cpp : 13 : 20 : 오류 : 'A'에서 스칼라가 아닌 유형 'std :: string'으로의 변환이 요청되었습니다.

온라인 데모 : http://ideone.com/DJut1

하지만 작성하자마자 :

std::string s = static_cast<std::string>(a); //ok - explicit conversion 

오류가 사라집니다 : http://ideone.com/LhuFd

BTW, C ++ 11에서 명시 적 변환 연산자는 boolean으로 변환되는 경우 "문맥 변환 연산자"라고 합니다 . 또한 암시 적 및 명시 적 변환에 대해 자세히 알고 싶다면 다음 항목을 읽어보십시오.

도움이되기를 바랍니다.


9
C ++ 03에서도 암시 적 변환을 피하는 것은 쉽습니다. toString대신 함수를 호출하십시오 operator std::string. 물론 이로 인해 일부 템플릿에 문제가 발생할 수 있습니다. 저는 항상을 사용해 왔으며 toString문제를 일으키지 않았지만 코딩 스타일에 따라 달라질 수 있다고 생각합니다.
James Kanze 2011

@MatthieuM. operator std::string():-) 처럼 .
James Kanze

2
to_string대신 사용 합니다. C ++ 11에서 호출 한 것이기 때문에 포워드 호환 코드 를 작성 하는 데 도움이되며 템플릿에도 도움이됩니다.
Luis Machuca

1
std::string s(a)std::string s{a}또한으로 작동합니다 static_cast<std::string>(a).
alfC

2
@Bin : 을 작성할 때 컴파일러에 의해 컨텍스트 적 으로 explicit operator bool() 호출 되기 때문 입니다 . 여기서 발생하는 변환은 (비공식적으로) 호출됩니다.if(std::cin) 암시 적 변환이 아니라 컨텍스트 변환 합니다.
Nawaz 2015
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.