2013-06-20 21 views
7

ile başlatılırken daraltma konusunda uyarı yok Açık bir daraltma dönüşümü bulduğum şaşırtıcı bir duruma düştüm, ancak derleyici (gcc-4.7.2) -Wall -Wnarrowing -pedantic bayraklarına rağmen bir uyarı vermediği için hayal kırıklığına uğradım. Aşağıdaki programa bakınız: a1 aitParantezler

struct A { 
    int m; 
    A(int m) : m(m) {}; 
}; 

int main() { 
    unsigned long v = 0; 
    A a1(v); // narrowing, but no warning (should this not cause a warning?) 
    A a2{v}; // narrowing, warning raised (expected) 
} 

Başlatma derleyici dikizlemek kadar olmadan sinek gibi görünüyor. Sadece delirmediğimden emin olmak için, a1'u aynı şekilde başlatmayı denedim, ancak parantez yerine parantez ile. Derleyici, beklendiği gibi ikinci durumda daraltma konusunda uyarıyor.

Açık olmak gerekirse: Başlatma listelerindeki daraltma dönüşümlerinin yasallığını sormuyorum. Bunun yasal olmadığını biliyorum - a2'un kıvrımlı şekilde başlatılması sadece bir akıl-kontrolüydü. Sorumun başlangıç ​​listeleri ile ilgisi yoktur. Bu yinelenen bir soru değil.

derleyici a1 başlatılmasına yönelik daralma beni uyarmaya gerekmez mi?

+0

"a1" için yapıcı bir örtük dönüştürme yapabilir, "a2" ise bunu yapamaz. Neden aynı olmaları gerektiğini düşünüyorsun? –

+1

'-Wconversion 'bayrağını eklerseniz ne olur? –

+0

Bu bir kopya değil. Başlatma listelerindeki dönüşümlerin daraltılmasının yasa dışı olduğunu zaten biliyordum. Ben parantez ile başlangıç ​​hakkında soruyorum. –

cevap

2

Wsign-conversion kod satırı için bir uyarı üretecektir - -Wconversion olmaz unsigned long ve int (birçok platformda doğrudur, hatta bazı 64-bit platformlar) aynı boyutta olduğunda. C kodu için, -Wconversion, örtülü olarak -Wsign-conversion'u etkinleştirir, ancak bazı nedenlerle C++ ile bu olmaz.

Eğer long long için v tipini değiştirmek, tek başına -Wconversion bir uyarı (int 32-bit olduğu varsayılarak) oluşturur.

+0

İçgörü için çok teşekkür ederim. Başlatıcı listesi semantiklerinin dönüşümler konusunda çok spesifik olduğuna sevindim - bu, en çok taşınabilir olmak için kod ihtiyacım olan her yerde kullanmamın iyi bir nedeni olabilir, bu yüzden derleyici aslında hedeflemeden önce dönüşüm tuzaklarını yakalayabilir yeni bir platform. –

İlgili konular