2011-11-23 11 views
77

Jeśli chodzi o konstruktorów, dodanie słowa kluczowego explicit uniemożliwia entuzjastycznemu kompilatorowi tworzenie obiektu, który nie był jego pierwszą intencją. Czy taki mechanizm jest dostępny również dla operatorów odlewniczych?Czy operator obsady może być jawny?

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

Oto, na przykład, chciałbym móc oddawać Foo w std::string, ale ja nie chcę takiej obsady zdarzyć się niejawnie.

Odpowiedz

94

Tak i nie.

Zależy to od używanej wersji języka C++.

  • C++ 98 i C++ 03 nie obsługują explicit typu operatorów konwersji
  • Ale C++ 11 robi.

Przykład,

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 
} 

skompilować go z g++ -std=c++0x, otrzymasz ten błąd:

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

demo online: http://ideone.com/DJut1

Ale jak tylko napisać:

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

Błąd odchodzi: http://ideone.com/LhuFd

BTW, w C++ 11, wyraźne operator konwersji jest nazywany "kontekstowej operatora konwersji" jeśli to konwertuje do logiczną. Ponadto, jeśli chcesz dowiedzieć się więcej o ukrytych i jawnych konwersji, przeczytaj ten temat:

nadzieję, że pomoże.

+1

+1. Czy mógłbyś zamieścić przykład kodu C++ 11? – FailedDev

+1

@FailedDev: Gotowe. :-) – Nawaz

+1

Bardzo miłe dzięki! – FailedDev

Powiązane problemy