2014-12-11 9 views
6

mam jakiś kod, który zasadniczo sprowadza się do następujących:Czy poprawnie zdefiniowano zmienną niezainicjowaną na liście parametrów funkcji?

void bar(bool b, double f) 
{ 
    if (b){ 
     double g = f; 
    } 
} 

void foo() 
{ 
    double f; 
    bool b = false; 
    bar(b, f); 
} 

Czy istnieje niezdefiniowane zachowanie tutaj? Podejrzewam, że może być, ponieważ biorę kopię wartości niezainicjowanej double, przekazując f do bar. Powiedział, że nie korzystam z przekazanego double, ponieważ blok if nie będzie działać.

Ponadto będzie wszystko w porządku, gdybym zdać double przez odniesienie:

void bar(bool b, double& f) 

to nie jestem „za” zmienną zainicjalizowana, ale jestem po prostu odnosi się do niego.

+5

Nie masz niezdefiniowanego zachowania, dopóki nie spróbujesz uzyskać dostępu do zmiennej, a ponieważ jest to wykonywane podczas przekazywania wartości przez funkcję, masz niezdefiniowane zachowanie w wywołaniu. Jeśli zamiast tego przekazujesz referencję, masz niezdefiniowane zachowanie w funkcji, gdy uzyskasz dostęp do wartości referencyjnej. –

+0

"używanie unitializowanej wartości nie jest samo w sobie nieokreślonym zachowaniem, ale jego wartość jest po prostu nieokreślona." (Od [tej odpowiedzi] (http://stackoverflow.com/a/11965368/96780)) –

+1

@ Danielanasas * Jeśli lwartość wyznacza obiekt automatycznego czasu przechowywania, który mógł zostać zadeklarowany przy użyciu klasy pamięci rejestru (nigdy nie miał podjętego adresu), a obiekt ten nie został zainicjowany (nie został zadeklarowany za pomocą inicjalizatora i przed użyciem nie zostało wykonane przypisanie), ** zachowanie jest niezdefiniowane. *** A ta odpowiedź odnosi się do C btw. – 2501

Odpowiedz

9

Tak, zachowanie jest niezdefiniowane. Ty jesteś biorąc kopię wartości niezainicjowanego double podczas przekazywania go na liście parametrów funkcji.

Przekazywanie przez odniesienie jest dobrze zdefiniowane, ponieważ wszystko, co robisz, wiąże to odwołanie do tego double. Oczywiście zachowanie dostępu do tego odwołania będzie niezdefiniowane.

N4140:

[dcl.init]

12 ... Jeśli wartość nieokreśloną jest produkowany przez oceny, zachowanie jest niezdefiniowana z wyjątkiem następujących przypadków:

(Pominięto nietrafny tekst dotyczący niepodpisanych wąskich typów znaków)

Powiązane problemy