2013-06-26 11 views
5

Rozważmy kolejny kodfunkcja lub deklaracja wystąpienia?

struct X 
{ 
    X(float) {} 
}; 

int const x = 3; 

X f(float(x)); 

Jeżeli standardowy kompilator C++ analizować ostatnią linię jako deklaracji funkcji z rodzaju X (*)(float) lub jako dokonywania wystąpienie X wywołując X::X(float(3))?

+1

to jest deklaracja –

+0

@Mahmoud Al-Qudsi - masz rację. jest on powiązany z –

Odpowiedz

8

To jest deklaracja funkcji. Punkt 8,2/1 C++ 11 standardowych opisano poniżej:

Niejednoznaczność wynikająca z podobieństwa pomiędzy obsadą funkcji stylu oraz zgłoszenia wymienionego w 6,8 mogą również występować w kontekście zgłoszenia. W tym kontekście wybór znajduje się pomiędzy deklaracją funkcji z redundantnym zestawem nawiasów wokół nazwy parametru i deklaracją obiektu z funkcją stylu rzutowaną jako inicjator. Podobnie jak w przypadku niejednoznaczności wymienionych w 6.8, , należy rozważyć każdy konstrukt , który może być deklaracją o deklaracji.

Standard zapewnia także przykład:

struct S { 
    S(int); 
}; 
void foo(double a) { 
S w(int(a)); // function declaration  <=== Your example 
S x(int()); // function declaration 
S y((int)a); // object declaration 
S z = int(a); // object declaration 
} 

Deklaracja w przykładzie deklaruje funkcję, która pobiera float i zwraca X, czego dowodem jest (non-wypalania) twierdzenie statycznego w Poniższy program (live example):

#include <type_traits> 

struct X 
{ 
    X(float) {} 
}; 

int const x = 3; 

X f(float(x)); 

int main() 
{ 
    static_assert(std::is_same<decltype(f), X(float)>::value, "!"); 
} 
+0

czy mógłbyś wyjaśnić, jaki rodzaj funkcji deklaruje, przykład: – aaronman

+0

@aaronman: Rozszerzyłem odpowiedź –

+0

, więc to, co dzieje się z 'x', ponieważ' float (x) 'nie jest prawem typu, w deklaracja funkcji powinieneś mieć typ – aaronman