2013-08-12 40 views
6

Aşağıdaki kod verildiğinde, derleyici neden Bar oluştururken örtük dönüştürmeyi çözmez? Yani, a gibi Foo inşa edilmiş, Bar oluşturmak için kullanılmalıdır (olmalıdır)?C++ 'daki örtük dönüşümler

#include <string> 

class ImplicitlyConvertToChar 
{ 
public: 
    ImplicitlyConvertToChar(const char* a_char) 
    : m_string(a_char) 
    { } 

    ImplicitlyConvertToChar(const char* a_char, size_t a_end) 
    : m_string(a_char) 
    { 
    } 

    template <typename T_String> 
    ImplicitlyConvertToChar(T_String const& a_string) 
    : m_string(a_string.begin()) 
    { 
    } 

    operator char const *() const 
    { return m_string; } 

    const char* m_string; 
}; 

class Foo 
{ 
public: 

    Foo(const ImplicitlyConvertToChar& a_charLike) 
    : m_string(a_charLike) 
    { } 

    const char* m_string; 
}; 

class Bar 
{ 
public: 
    Bar(const Foo& a_foo) 
    : m_foo(a_foo) 
    { } 

    Foo m_foo; 
}; 

int main() 
{ 
    Foo a("this works"); 
    Bar b("Why doesn't this?"); 
} 
+0

Bu standardın bir parçası, örtülü dönüşümler böyle zincirlenemez. Yalnızca bir örtük dönüşüme sahip olabilirsiniz. – IronMensan

cevap

9

Birden çok kullanıcı tarafından örtük bir dönüşüm tanımına izin verilmez. Foo örnek bir tane içerir, Bar örnek iki içerir.

4

Derleyici yalnızca tek bir örtülü kullanıcı tanımlı dönüşümü yapmasına izin verilir.

A user-defined conversion consists of: 
    zero or one non-explicit single-argument constructor or non-explicit 
    conversion function calls 

http://en.cppreference.com/w/cpp/language/implicit_cast iki gerektirecektir bu şekilde Bar Oluşturma Bkz.

+4

Açılış kuralınız doğru değil. Derleyici, tek bir örtük *** kullanıcı tanımlı *** dönüşümü yapmasına izin verilir. –

+2

sevdiği gibi birçok örtülü *** standart *** dönüşümü gerçekleştirebilir. –

+1

@ArmenTsirunyan bu kritik gözetime işaret etmek için teşekkürler. Cevap güncellendi. – zmb