2013-06-26 47 views
5

Xem xét các mã tiếp theotuyên bố chức năng hoặc ví dụ?

struct X 
{ 
    X(float) {} 
}; 

int const x = 3; 

X f(float(x)); 

nên một trình biên dịch C++ tiêu chuẩn phân tích dòng cuối cùng như một lời tuyên bố chức năng với kiểu X (*)(float) hay như làm một thể hiện của X bằng cách gọi X::X(float(3))?

+1

Đó là tuyên bố –

+0

@Mahmoud Al-Qudsi - bạn hoàn toàn đúng. nó có liên quan –

Trả lời

8

Đó là tuyên bố chức năng. Đoạn 8.2/1 của C++ 11 Chuẩn giải thích điều này:

Sự mơ hồ phát sinh từ sự tương đồng giữa một dàn diễn viên chức năng theo phong cách và một tuyên bố đề cập trong 6,8 cũng có thể xảy ra trong bối cảnh của một bản tuyên bố. Trong bối cảnh đó, sự lựa chọn nằm giữa một khai báo hàm với một bộ ngoặc đơn dư thừa xung quanh tên tham số và khai báo đối tượng có kiểu hàm làm trình khởi tạo. Cũng giống như những sự mơ hồ được đề cập trong 6.8, độ phân giải là xem xét bất kỳ cấu trúc nào có thể có thể là tuyên bố một tuyên bố.

Tiêu chuẩn cũng cung cấp một ví dụ:

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 
} 

Việc kê khai trong ví dụ của bạn tuyên bố một chức năng mà phải mất một float và trả về một X, như được chứng tỏ sự (không bắn) khẳng định tĩnh trong chương trình sau (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

bạn có thể giải thích loại hàm này khai báo hay không, ví dụ là – aaronman

+0

@aaronman: Tôi mở rộng câu trả lời –

+0

vì vậy điều gì xảy ra với 'x' vì' float (x) 'không phải là kiểu đúng, trong khai báo hàm bạn phải có một loại – aaronman

Các vấn đề liên quan