2014-10-30 17 views
8

này biên dịch trong clang nhưng không phải trong gcc:Tại sao tôi không thể truy cập đối số mặc định trong trình khởi tạo trong gcc?

void f(int x = decltype(x){}); 

Các lỗi trong gcc nói rằng x không được khai báo trong phạm vi này nhưng theo 3.3.2/1 biến x phải ở trong phạm vi:

Điểm khai báo tên ngay sau người khai báo hoàn chỉnh (khoản 8) và trước khi người khai báo (nếu có), ngoại trừ như được nêu dưới đây. [Ví dụ:

int x = 12; 
{ int x = x; } 

Ở đây, x thứ hai được khởi tạo với giá trị riêng (không xác định). - ví dụ kết thúc]

Vậy clang có đúng không? Có nên truy cập x trong bộ khởi tạo của riêng nó không?

PS: int x = x làm tham số không thành công trong cả hai trình biên dịch nhưng tôi không biết tại sao.

Trả lời

10

GCC là chính xác; điều đó không hợp lệ.

C++ 11 8.3.6/9 [dcl.fct.default] thông số của một hàm không được sử dụng trong một cuộc tranh luận mặc định, ngay cả khi họ không được đánh giá.

+0

Vậy điều đó có nghĩa là có lỗi trong Clang? Nó có nên được báo cáo không? –

+0

@templateboy Tiêu chuẩn quá không chính xác và nên cho phép các trường hợp xảy ra tham số trong toán hạng chưa được đánh giá của đối số mặc định. – Columbo

+1

@templateboy: Có thể cho rằng Clang hoặc tiêu chuẩn nên được sửa. Không có lý do chính đáng để cấm nó trừ khi nó được đánh giá. –

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