2014-04-17 21 views
5

bir başlatıcı listesinde kullanıldığında yalnızca boş bir dize kabul edecek bir yapıcı bir aşırı yapmak mümkün mü?Dize Değişmez Aşırı

struct null_ptr_type; 

struct str 
{ 
    str(null_ptr_type*) {} 
    str(const char(&)[1]) {} 
}; 

struct config 
{ 
    str s; 
}; 

int main() 
{ 
    config c1 = {0}; // Works, implicit conversion to a null pointer 
    config c2 = {str("")}; // Works 
    config cx = {str("abc")}; // Fails (as desired) 
    config c3 = {""}; // Fails with no conversion possible 
} 

da boş olmayan dizeler kabul etmeden c3 iş için sözdizimi yapmak için bir yolu var mı? c1'un çalışması nedeniyle neden yapılmadığını anlamıyorum. Bunu yasaklayan bir kural var mı? C++ 11 ve "tek tip başlatma sözdizimi" Kullanımı

+0

FWIW, VS 2013 örtük dönüştürme çağırır bekliyoruz. Bildiğim en iyi referans değil ama bir şey. –

+0

Sağol belki de belirtmelidir: 'g ++ (~ 12.04 Ubuntu/Linaro 4.7.3-2ubuntu1) 4.7.3', ama iyi bir yerde çalışır duymak. :) –

+1

clang ++ 3.5 da bu dönüşümü kabul ediyor. – dyp

cevap

0

Eğer struct config arayüzünün değiştirmek edebiliyoruz varsayımına, bu işi yapabilir: yaptığınız gibi

struct config 
{ 
    str s; 

    config(str s) : s(s) {} 
}; 

int main() 
{ 
    config c1 = {0}; // Works, implicit conversion to a null pointer 
    config c2 = {str("")}; // Works 
    config cx = {str("abc")}; // Fails (as desired) 
    config c3 = {""}; // Works 
} 
İlgili konular