2013-02-03 48 views
10

Mã sau đây có hợp pháp trong C++ không?Có thể một tham số không có tên của hàm có giá trị mặc định không?

void f(void* = 0) 
{} 

int main() 
{ 
    f(); 
} 

Trang nào của chuẩn C++ nói rằng việc sử dụng này là hợp pháp?

+0

Tuy nhiên nó là, tôi không thể tìm ra trong tình huống giả tạo một tính năng như vậy thực sự có thể có bất kỳ sử dụng ... –

+3

@MatteoItalia 'enable_if' thông thường. – Pubby

+0

@MatteoItalia: SFINAE –

Trả lời

11

Vâng, đó là hợp pháp.

Không có từ ngữ chuẩn nào cho phép kết hợp các tính năng này một cách cụ thể; chỉ đơn giản là không có bất kỳ để không cho phép nó, một trong hai.

cú pháp mặc định lập luận áp dụng cho hoạt động các thông số trong một tham số khai:

[C++11: 8.3.6/1]:Nếu một initializer-khoản được quy định trong một tham số khaiinitializer-khoản này là được sử dụng làm đối số mặc định. Đối số mặc định sẽ được sử dụng trong các cuộc gọi trong đó đối số đường đi bị thiếu.

... và chức năng các thông số trong một tham số khai có thể giấu tên:

[C++11: 8.3.5/11]:[..] Một fi er identi thể tùy được cung cấp như một tên tham số. [..]

Thậm chí còn có một ví dụ về việc sử dụng này theo 8.3.6/4 (mặc dù ví dụ là không bản quy phạm văn bản, vì vậy đây không thể được sử dụng để chứng minh bất cứ điều gì cụ thể).

11

Có, nó hoàn toàn hợp pháp. Một ví dụ rõ ràng được tìm thấy trong N3485 8.3.6 Mặc định Arguments/4:

[Ví dụ: tờ khai

void point(int = 3, int = 4); 

tuyên bố một chức năng mà có thể được gọi với không, một hoặc hai đối số loại int.

+2

Ví dụ không phải là chuẩn;) –

+0

@LightnessRacesinOrbit, tôi đang tìm kiếm :) Nó không giống như nó nói rõ ràng "Đối số mặc định có thể không được đặt tên." Tôi tưởng tượng nó đi ra khỏi cơ sở mà nó chia sẻ tài sản với các tham số không được mặc định. – chris

+0

Được rồi, tôi đã có một bằng chứng khó hiểu, nhưng Light đã làm tốt hơn rất nhiều, vì vậy không đáng nhầm lẫn với những người đến sau :) – chris

1

Có, nó là hợp pháp.
Các sản phẩm cú pháp được đưa ra cho các tham số chức năng trong điều 8.3.5/1 cho phép khai báo tham số không có mã định danh, nhưng với biểu thức gán (như trình khởi tạo).

-1

Không chỉ là hợp pháp, nó thực sự có thể khá hữu ích tùy thuộc vào phong cách mã hóa của bạn.

Thông số mặc định chỉ có ý nghĩa trong khai báo hàm.

Thông số được đặt tên chỉ có ý nghĩa trong định nghĩa hàm.

f.h:

void f(void*=nullptr); 

f.cc

void f(void* x) 
{ 
... 
} 
+2

_ "Các thông số được đặt tên chỉ có ý nghĩa trong định nghĩa hàm." _ Lolwut .. Tôi hiểu những gì bạn đang cố gắng để nói ở đây nhưng tôi thấy nó hơi lố bịch. –

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