2014-04-17 24 views
5

Czy możliwe jest przeciążenie konstruktora, który będzie akceptował tylko pusty ciąg znaków w przypadku użycia na liście inicjalizatora?Przeciążanie literowe ciągów znaków

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 
} 

Czy istnieje sposób, aby składnię c3 pracy bez jednoczesnego przyjmowania niepuste ciągi? Nie rozumiem, dlaczego tak się nie dzieje, z uwagi na to, że działa c1. Czy jest tu jakaś reguła, której tu brakuje, co zabrania tego?

+0

FWIW, VS 2013 wywołuje niejawna konwersja tak jak oczekiwać. Nie najlepsze referencje, które znam, ale to coś. –

+0

Dzięki, może powinienem określić: 'g ++ (Ubuntu/Linaro 4.7.3-2ubuntu1 ~ 12.04) 4.7.3', ale dobrze to słyszeć działa gdzieś. :) –

+1

clang ++ 3.5 także akceptuje tę konwersję. – dyp

Odpowiedz

0

Korzystanie C++ 11 i „jednolitej składni inicjalizacji” można wykonywać tę pracę, na założeniu, że jesteś w stanie modyfikować interfejs struct config:

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 
}