2011-11-23 27 views
77

Kurucular söz konusu olduğunda, explicit anahtar kelimesini eklemek, hevesli bir derleyicinin, programcının ilk amacı olmadığında bir nesne oluşturmasını engeller. Operatörler için de böyle bir mekanizma kullanılabilir mi? İşteBir yayın operatörü açık olabilir mi?

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

, örneğin, bir std::string içine Foo döküm edebilmek istiyorum ama örtük gerçekleşmesi için böyle döküm istemiyoruz.

cevap

94

Evet ve Hayır

Bu hangi C++ sürümü üzerinde, kullandığınıza bağlıdır

.

  • C++ 98 ve C++ 03
  • Ama C++ 11 yapar explicit tip dönüşüm operatörleri desteklemez.

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

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

    Ama siz yazarken:

Örnek,

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 
} 

Bu hatayı alırsınız, g++ -std=c++0x ile derleme

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

Hata kaybolduktan: http://ideone.com/LhuFd

BTW, C++ 11, açık dönüşüm operatörü boolean dönüşür eğer"içeriksel dönüşüm operatörü" olarak adlandırılır.

Umut yardımcı olur: Eğer örtülü ve açık dönüşümleri hakkında daha fazla bilgi edinmek istiyorsanız Ayrıca, bu konuyu okuyun.

+1

+1. C++ 11 kodunun bir örneğini gönderebilir misiniz lütfen? – FailedDev

+1

@FailedDev: Bitti. :-) – Nawaz

+1

Çok güzel teşekkürler! – FailedDev

İlgili konular