Bir döküm operatörü açık olabilir mi?


84

Yapıcılar söz konusu olduğunda, anahtar kelimeyi eklemek, explicithevesli bir derleyicinin programcının ilk niyeti olmadığında bir nesne oluşturmasını engeller. Böyle bir mekanizma döküm operatörleri için de mevcut mu?

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

Burada, örneğin, Foobir atım yapabilmek isterdim std::string, ancak böyle bir rolün örtük olarak gerçekleşmesini istemiyorum.

Yanıtlar:


101

Evet ve hayır.

Hangi C ++ sürümünü kullandığınıza bağlıdır.

  • C ++ 98 ve C ++ 03, explicittür dönüştürme operatörlerini desteklemez
  • Ancak C ++ 11 bunu yapar.

Misal,

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 
}

İle derleyin g++ -std=c++0x, şu hatayı alacaksınız:

prog.cpp: 13: 20: hata: 'A'dan skaler olmayan' std :: string 'türüne dönüştürme istendi

Çevrimiçi demo: http://ideone.com/DJut1

Ama yazar yazmaz:

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

Hata ortadan kalkar : http://ideone.com/LhuFd

BTW, C ++ 11'de, açık dönüştürme operatörü, boolean'a dönüştürüyorsa "bağlamsal dönüştürme operatörü" olarak anılır . Ayrıca, örtük ve açık dönüştürmeler hakkında daha fazla bilgi edinmek istiyorsanız bu konuyu okuyun:

Umarım yardımcı olur.


9
C ++ 03'te bile, örtük dönüştürmeden kaçınmak kolaydır. Bunun toStringyerine işlevi çağırmanız yeterli operator std::string. Elbette bu, bazı şablonlarda sorunlara neden olabilir. Her zaman kullandım toStringve bu bana hiçbir zaman sorun çıkarmadı, ancak bunun kodlama stilinize bağlı olabileceğini hayal ediyorum.
James Kanze

@MatthieuM. Tıpkı operator std::string():-) gibi .
James Kanze

2
Onun to_stringyerine kullanıyorum. O yazma ileriye uyumlu kod yardımcı olur bu yüzden ne C ++ 11 çağrılar bu kadar yardımcı olur ve bu şablonları ile yardımcı olur.
Luis Machuca

1
std::string s(a)veya std::string s{a}olarak da çalışmalıdır static_cast<std::string>(a).
alfC

2
@Bin: Çünkü yazarken derleyici tarafından bağlamsalexplicit operator bool() olarak çağrılır . Burada meydana gelen dönüşüme (gayri resmi olarak) bağlamsal dönüşüm denir , örtük dönüşüm değil . if(std::cin)
Nawaz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.