2016-06-30 11 views
7

Kod:C++: czy funkcja ponownie deklaruje niezdefiniowane zachowanie?

#include <iostream> 
using namespace std; 

int f(int x = 0) { 
    cout << "x:" << x << endl; 
    return 0; 
} 
int main() { 
    f(); 
    int f(int x = 1); 
    f(); 
    return 0; 
} 

Output (testowane na g ++ 5.1):

x:0 
x:1 

Moje pytanie:

  1. Czy int f(int x = 1); deklaracji lub definicji?
  2. Czy funkcja ta jest niezdefiniowanym zachowaniem?
+0

Zauważ, że 'x = 0' i' x = 1' nie są "częścią" 'f()', to tylko konwencja wywołująca, która jest wykonywana w kontekście wywołującego. W związku z tym możesz nawet określić 'alloca()', wywołujący to nazwie, a nie 'f()' ... – lorro

+2

Bez względu na to, czy jest to legalność, jest to skomplikowany, mylący kod i jako taki najlepiej unikać IMHO. –

+3

[Potrzebujesz lepszego kompilatora lub potrzebujesz podkręcić ostrzeżenia] (http://coliru.stacked-crooked.com/a/1ad7569b3bd7556e). Twoja brakująca instrukcja return tworzy ten kod UB. – NathanOliver

Odpowiedz

14

Od §8.3.6 w dcl.fct.default:

  1. Dla funkcji non-szablonu, domyślne argumenty mogą zostać dodane w późniejszych deklaracji funkcji w same zakres. Deklaracje w różnych zakresach mają całkowicie odrębne zestawy domyślnych argumentów.

Nie zachowanie nieokreślone. To, co widzisz, jest obowiązkowe.

Powiązane problemy