Jeśli chodzi o konstruktory, dodanie słowa kluczowego explicit
uniemożliwia entuzjastycznemu kompilatorowi utworzenie obiektu, gdy nie było to pierwszym zamiarem programisty. Czy taki mechanizm jest dostępny również dla operatorów odlewów?
struct Foo
{
operator std::string() const;
};
Tutaj, na przykład, chciałbym móc rzucać Foo
w a std::string
, ale nie chcę, aby takie rzucanie miało miejsce w sposób pośredni.
toString
, a nieoperator std::string
. Oczywiście może to powodować problemy z niektórymi szablonami. Zawsze używałemtoString
i nigdy nie sprawiało mi to żadnych problemów, ale wyobrażam sobie, że może to zależeć od twojego stylu kodowania.operator std::string()
:-).to_string
zamiast tego. Pomaga, że tak to nazywa C ++ 11, więc pomaga pisać kod zgodny z przyszłymi wersjami i pomaga w szablonach.std::string s(a)
lubstd::string s{a}
powinien również działać jakostatic_cast<std::string>(a)
.explicit operator bool()
jest wywoływane kontekstowo przez kompilator podczas pisaniaif(std::cin)
. Zauważ, że zachodząca tutaj konwersja jest (nieformalnie) nazywana konwersją kontekstową , a nie konwersją niejawną .