2015-04-27 7 views
8

Ben daha etkilidir aşağıda gibi doğrudan liste-başlatma ile kod yazma alışkanlığı geldim ve onu narrowing örtülü önlemek için çok yararlı olacaktır:
Otomatik ile doğrudan liste başlatması neden hatalı sayılıyor veya tercih edilmiyor?

int i {0}; 
string s {""}; 
char c {'a'}; 
bool b {false}; 

auto num {100}; // But this?? 

Ama oto belirtici gelince, Kötü olduğunu düşündüğümü ya da böyle yazmak için tercih edilmediğini duydum, neden bu?

+7

Kıvrık diş tellerinin etrafında bir sürü kusur ve gariplik vardır. Örneğin. int n; int & r {n}; 'kırılmıştı. Ve 'auto x = {1, 2} 'nin' auto y = {1} 'için dejenerasyonu şaşırtıcı olabilir. Temel olarak, kaşlı ayraçlar, bazı kişilerin okurlarınızla kafa karıştırmaya değmeyeceğini düşündüğü pek çok tekdüzeliği ortaya çıkarır. –

+2

şiddetle tavsiye: [herb Sutter: Neredeyse Her Zaman Otomatik] (http://herbsutter.com/2013/08/12/gotw-94-solution-aaa-style-almost-always-auto/) – bolov

+2

Türü kesinti tam olarak sorun. Kıvırcık diş telleri çok farklı anlamlara sahiptir ve derleyicinin doğru yerde yapmak istediğiniz şeyi çıkarmasını ve aynı zamanda sol taraftaki türünü de çıkarmasını istersiniz. Bunun anlamı, kesintinin sağ taraftaki şaşırtıcı sonuca sahip olması (özellikle de derleyicinin, ne tür bir sonuç türü olmadığı için ne istediğinizi bilmemesi nedeniyle), sol tarafın sonucu otomatik olarak kabul etmesi ve hiçbir şeyin yanlış olmadığını kontrol etmemesi anlamına gelir. . – StenSoft

cevap

11

İşte o sözdizimi kullanarak başarısız nerede bir örnek:

struct Foo{}; 

void eatFoo (const Foo& f){} 

int main() { 
    Foo a; 
    auto b{a}; 
    eatFoo(b); 
} 

Bu ince olmasını bekliyor olabilir: b bir Foo olmalı ve eatFoo geçirilecek. Ne yazık ki, bu şu derleyici hatası ile sonuçlanır:

prog.cpp:11:10: error: invalid initialization of reference of type 'const Foo&' from expression of type 'std::initializer_list<Foo>' 
    eatFoo(b); 

Gördüğünüz gibi, b aslında tip std::initializer_list<Foo> taşımaktadır. Kesinlikle bu durumda istediğimiz şey değil. Bunu auto b = a olarak değiştirirsek, bu iyi çalışır. Daha sonra auto'u kullanmaya devam etmek istiyorsak ancak türünü açıkça belirtirsek, onu auto b = Foo{a} olarak değiştirebilir ve derleyicinin kopyayı elemesine izin verebiliriz.

+1

Umarım bu C++ 17'de düzeltilecektir: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3912.html –

+4

"Eğer hala otomatik kullanmak istiyorsak ', ama açıkça türü belirtin, '- Bu gerçekten mantıklı değil. 'Auto'nun tüm noktası, türü belirtmekten kaçınıyor. Biliyorum C# var gerçekten insanlar var "var x = (string) null;" yerine dize x = null; ', ama onlar küçük bir kesir ve ben hiç kimse aslında yazma kodu gibi savunan kimse . C++ 'da bunun için geçerli bir argüman düşünemiyorum. – hvd

+2

[Hemen Her Zaman Otomatik Tarz] 'ın bir parçası (http://herbsutter.com/2013/08/12/gotw-94-solution-aaa-style-almost-always-auto/). Oldukça etkili bazı insanlardan tartışıldığı için, bunu eklemek uygun görünmektedir. – TartanLlama

İlgili konular