2016-09-30 20 views
5

, kullanıcı tanımlı dönüştürme işlevi C::operator A() aşağıdaki parçasında dolaylı kopya başlatır bir direkt başlatma değişken a tip A bir prvalue içine tip C bir lvalue dönüştürmek için çağrılır.Tam olarak C++ 14 Standardında, doğrudan başlatma işleminde kullanıcı tanımlı bir dönüştürme işlevinin kullanılmasına izin veriliyor mu? Örneğin

struct A {}; 
struct C { operator A() { return A(); }; }; 

int main() 
{ 
    C c; 
    A a(c); 
} 

Sadece bunun C++ 14 Standardında nerede açıklandığını bilmek istiyorum. Cevabın [over.match.copy]/1 mermi noktasında (1.2) olduğunu hissediyorum, ancak kullanıcı tanımlı dönüşüm tarafından Kopya başlatma başlatılması ile ilgili bir sorun yaşıyorum. Tek bir argüman ile çağrılabilir A iki kurucular vardır

+0

Ben kullanıcı tanımlı conversion_ tarafından _copy-başlatma tipi 'A (const C &)' bir yapıcı ifade eder düşünüyorum, ama bu kod kullanır gibi değil. Kodunuz, yalnızca kullanıcı tanımlı bir dönüşümün sonucu olan bir argümana sahip kopya kurucuyu 'A (const A &)' olarak adlandırır. – rodrigo

+3

[over.match.ref]. Kopyalama kurucusunun parametresine bağlanmak için 'c' gerçekten dönüştürüyorsunuz. –

+0

@rodrigo Tam olarak bu sorularımda anlatmaya çalıştığım şey, yani kod, "c" değişkenini "c" den "C" ye çevirme işlevini kullanarak başlatmak için varsayılan kopya yapıcıyı kullanıyor.) '. –

cevap

0

: Çeşidi

Bir referans ": Her iki durumda da

A(A const&); // copy constructor 
A(A&&);  // move constructor 

, [dcl.init.ref] biz referansı başlatabilir açıklar cv1T1 "," cv2T2 "türünde bir ifade ile başlatılır:
- başvurusu, bir lvalue referansı ve başlatıcı ifade
    ise - bir lvalue (ama biraz alan değil), ve “CV1T1” referans uyumlu ile “CV2T2” veya
    - T1T2 için referans ilgili olmayan bir sınıf tipi (örneğin, T2 bir sınıf tipi) sahiptir ve tipte bir lvalue dönüştürülebilir “CV3T3”, burada “ cv1T1, daha sonra
    CV3T3 ‘(bu dönüşüm uygulanabilir dönüştürme işlevleri numaralandırma tarafından seçilir ([over.match.ref]) ve aşırı yük çözünürlük iyi bir tercih)
” ile referans uyumlu’ Referans, birinci durumda başlatıcı ifade değerine ve ikinci durumda (ya da her iki durumda da, nesnenin uygun temel sınıf alt nesnesine) dönüşümün sonuç değerine bağlıdır.

Biz tip A veya A const referansları A için referans ilgili bir sınıf tipidir tip C bir ifadesi ile başlatıldı sahiptir. S arasında

dönüştürme işlevleri ve temel sınıfları olarak kabul edilir: bir referans uyumlu tip CV3T3 dönüştürülebilir olmadığını kontrol etmek için, biz [over.match.ref] kontrol edin.S ve verim türü içinde gizli değildir olanlar açık olmayan dönüştürme işlevleri veya cv2T2” ya da “rvalue (bir lvalue referans ya da fonksiyona rvalue referans başlatırken)“lvalue referans cv2T2için” CV2T2 referans CV1TCV2T2 ‘‘referans uyumlu ile’”, (bir rvalue referans veya işleve bir lvalue referans başlatma)’, aday işlevlerdir. direkt başlatma için [...]

Dolayısıyla, kopya kurucu için, biz A& verim ve hareket yapıcısı için, biz A veya A&& verim bu dönüşüm işlevleri dikkate bu dönüşüm işlevleri göz önünde bulundurun. Birincisi yok, ama ikincisi var: operator A().

Bu hamle A yapıcısı uygulanabilir bir yapıcı değil A kopyası yapıcısı yapar. Sadece bir tane uygulanabilir adayımız olduğundan, en uygun olanı en önemlisidir.

İlgili konular