2011-11-23 2 views
77

컨스트럭터의 경우 키워드 explicit을 추가하면 열정적 인 컴파일러가 프로그래머의 첫 번째 의도가 아닐 때 객체를 만들 수 없습니다. 이러한 메커니즘이 캐스팅 오퍼레이터에게도 사용 가능합니까? 여기캐스트 연산자를 명시 할 수 있습니까?

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

, 예를 들면, 나는 std::stringFoo 캐스트 할 수 있도록하고 싶습니다,하지만 난 암시 적으로 발생하는 이러한 캐스트를 원하지 않는다.

답변

94

예와 아니요

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

  • 는 C++ 98과 C++ 03
  • 그러나 C++ (11)가하는 explicit 타입 변환 연산자를 지원하지 않습니다.

    prog.cpp:13:20: error: conversion from 'A' to non-scalar type 'std::string' requested

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

    그러나 곧 당신이 쓰는대로 :

예,

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로 컴파일

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

오류가 사라질 : http://ideone.com/LhuFd

을 BTW, C++ 11에서 명시 적 변환 연산자는 부울로 변환하는 경우"문맥 변환 연산자"로 지칭된다.

희망하는 데 도움이 : 당신이 암시 적 및 명시 적 변환에 대한 자세한 내용을 알고 싶다면 또한,이 주제를 참조하십시오.

+1

+1. C++ 11 코드의 예제를 게시 할 수 있습니까? – FailedDev

+1

@FailedDev : 완료. :-) – Nawaz

+1

아주 좋은 감사합니다! – FailedDev