2016-06-30 15 views
7

Codice:C++: è la funzione che ripresenta un comportamento non definito?

#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 (testato su g ++ 5.1):

x:0 
x:1 

La mia domanda:

  1. È int f(int x = 1); una dichiarazione o definizione?
  2. È la dichiarazione di funzione come quella di un comportamento non definito?
+0

nota che 'x = 0' e' x = 1' non sono 'parte di' 'f()', è solo una convenzione di chiamata che viene eseguita nel contesto del chiamante. Quindi, potresti anche specificare 'alloca()' lì, il chiamante lo chiamerà, non 'f()' ... – lorro

+2

Indipendentemente dalla legalità, è un codice complicato e confuso e, come tale, è meglio evitare IMHO. –

+3

[È necessario un compilatore migliore o è necessario attivare gli avvisi] (http://coliru.stacked-crooked.com/a/1ad7569b3bd7556e). La tua dichiarazione di reso mancante rende questo codice UB. – NathanOliver

risposta

14

Da §8.3.6 in dcl.fct.default:

  1. Per le funzioni non-modello, gli argomenti di default può essere aggiunto nelle dichiarazioni successive di una funzione nella stessa scopo. Le dichiarazioni in diversi ambiti hanno serie completamente distinte di argomenti predefiniti.

Comportamento non indefinito. Quello che vedi è obbligatorio.

Problemi correlati