2012-07-27 39 views
10

Các đoạn mã sau đây không biên dịch trên gcc-4.7.1:Có thể đặt tham số mẫu mặc định được đặt trước thông số mẫu mặc định không?

struct X {}; 

template <class T = X, typename U> 
void f(const U& m) { 
} 


int main() { 
    f<>(0); 
} 

Tuy nhiên, điều này không:

struct X {}; 

template <class T = X, typename U> 
void f(const U& m) { 
    auto g = []() {}; 
} 


int main() { 
    f<>(0); 
} 

gcc-4.7.1 phàn nàn:

c.cpp: In function 'void f(const U&)': 
c.cpp:5:15: error: no default argument for 'U' 

Vì vậy, câu hỏi của tôi là: đang đặt các tham số mặc định trước khi các tham số không mặc định chính xác trong mẫu chức năng? Nếu có, tại sao không biên dịch thứ hai? Nếu không, tại sao người đầu tiên biên dịch? Tiêu chuẩn C++ 11 nói về cú pháp này như thế nào?

+0

http://stackoverflow.com/questions/2447458/default-template-arguments-for-function-templates – Andrew

+0

@Andrew, bài đăng bạn đã đưa quá dài. Bạn có thể chỉ ra câu trả lời nào nói về nếu nó là chính xác để đặt tham số mặc định trước những người không mặc định? –

+1

@icando: Không có gì trong tiêu chuẩn mà * cấm * đặt các đối số mẫu mặc định cho các mẫu hàm ở bất kỳ đâu. Chỉ các mẫu * lớp * bị hạn chế. –

Trả lời

11

Nó bị cấm đối với các lớp và bí danh. n3290 § 14.1.11 trạng thái:

Nếu một mẫu tham số của một lớp mẫu hay bí danh template có một mặc định mẫu đối số, mỗi tiếp theo mẫu tham số trách nhiệm hoặc có một mặc định mẫu đối số cung cấp hoặc là một mẫu tham số gói

Đối với chức năng hạn chế duy nhất dường như có liên quan đến gói thông số:

một gói mẫu tham số của một hàm mẫu không được được theo sau bởi một thông số mẫu khác trừ khi tham số mẫu đó có thể được suy luận hoặc có tham số mặc định

Nhưng rõ ràng là không quan tâm đến trường hợp này.

Cho rằng không có gì trong § 14 cấm nó cho các chức năng có vẻ như chúng ta phải giả định nó được cho phép.

A note from a working group reports dường như xác nhận rằng đây là ý định. Từ ngữ được đề xuất ban đầu của phần đó là:

Nếu tham số mẫu của mẫu lớp có đối số mẫu mặc định, tất cả các thông số mẫu tiếp theo phải có đối số mẫu mặc định được cung cấp. [Lưu ý: Đây không phải là một yêu cầu cho chức năng mẫu vì đối số mẫu có thể được suy luận (14.8.2 [temp.deduct]).]

Tôi không thể nhìn thấy nơi lưu ý rằng đi trong phiên bản cuối cùng Tuy nhiên.

+1

vì vậy nó được cho phép, và lỗi trình biên dịch chỉ là một lỗi gcc? –

+0

Tôi * nghĩ * nó được cho phép. Nếu không có nghĩa là nó là một khiếm khuyết trong tiêu chuẩn mà không có từ ngữ từ chối nó.clang trên segfaults hệ thống của tôi biên dịch nó mặc dù quá, do đó, nó chắc chắn có vấn đề cho trình biên dịch tại thời điểm này một trong hai cách! – Flexo

+1

clang-3.2 trong MacPort của tôi thực sự biên dịch nó. Vì vậy, có lẽ kêu vang cố định đó đã? –

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