2016-04-19 8 views
9

Ben değişken başlatırken daralma önlemek için küme parantezleri/başlatıcı listelerini kullanarak aşina olduğum sırasında daralma önlemek, ama bunu kullanmak iyi bir uygulamadır için değişken de mi?C++: <em>bir karşı</em> bir değer atarken küme parantezi kullanarak atama

Örneğin;

int i{1};  // initialize i to 1 
double d{2.0}; // initialize d to 2.0 
i = {2};  // assign value 2 to i 
i = {d};  // error: narrowing from double to int 

Görev için kaşlı ayraç kullanmamanın bir nedeni var mı?

+5

Eğer daraltmak istiyorsanız? – xaxxon

+0

Şunu söyleyebilirim: atamalarda kullanmayın – Exceptyon

+0

Aşağıdakileri okuyun: https://herbsutter.com/2013/05/09/gotw-1-solution/ ve muhtemelen https://herbsutter.com/2013/ 08/12/gotw-94-çözüm-aaa-style-neredeyse-daima-otomatik / –

cevap

2

Başlatma vs assignment ile ilgili bir sorun değil.

Farklı türde bir sorun var.

double ile bir int değişkenini başlatmaya çalışırsanız, aynı hatayı alırsınız.

değerini başka bir double değişkenine atayabilirsiniz.

int main() 
{ 
    int i{1};  // initialize i to 1 
    //int i2{3.0}; // ERROR! 
    double d{2.0}; // initialize d to 2.0 
    double d2{1.0}; // initialize d2 to 1.0 
    i = {2};  // assign value 2 to i 
    //i = {d};  // error: narrowing from double to int 
    d2 = {d};  // OK 

    return 0; 
} 

Örneğiniz, zenginleştirilmiştir.

Değer atarken iyi bir uygulama? Hassasiyetin kaybedilmediğinden emin olmak için olabilirsiniz.

Bir örnek: Eğer

template <typename X, typename Y> 
void assign (X & x, Y const & y) 
{ x = {y}; } 

Yani daralma önlemek için emin bu şekilde bir şablon assign() işlev yazabilirsiniz

// i is of type int 
assign(i, 23); // OK 
assign(i, 11.2); // ERROR! 

ise daralması bir sorun değildir (aktarırken) küme parantezini önleyebilir.