2016-09-24 16 views
5

Chơi xung quanh với vị trí mới cho mảng, tôi đã đưa ra (một cách tình cờ/sai lầm) với đoạn mã sau:ngoặc xung quanh vị trí điều hành mới cho mảng

#include <new> 

struct X{}; 

int main() 
{ 
    char buf[256]; 
    std::size_t n = 10; 
    X* p = new (buf) (X[n]); // incorrect way, parenthesis by mistake 
    //X* p = new (buf) X[n]; // correct way 
} 

Dòng thứ ba trong main là không chính xác, mặc dù nó biên dịch . Không nên có bất kỳ dấu ngoặc đơn nào. clang++ spits out

cảnh báo: khi loại file là trong ngoặc đơn, mảng không thể có kích thước động

trong khi đầu ra gcc6

cảnh báo: ISO C++ cấm mảng chiều dài thay đổi [-Wvla] X * p = new (buf) (X [n]);

cảnh báo: độ dài không đổi mảng không đổi phải được chỉ định mà không có dấu ngoặc đơn xung quanh loại id [-Wvla] X * p = new (buf) (X [n]);

sau đó crashes with an internal compiler error (ICE) trong tree_to_uhwi, tại tree.h: 4044. Các lỗi biên dịch nội bộ chỉ xuất hiện trong gcc> = 6.

Câu hỏi của tôi: cách chính xác là dòng được đánh dấu "không chính xác" phân tích cú pháp/giải thích, tại sao nó "sai" để có những dấu ngoặc đơn *

* Đối với ICE, tôi sẽ điền vào một lỗi.

EDIT 1 Tôi chỉ nhận ra rằng ICE/cảnh báo (s) không có gì để làm với người dùng định nghĩa loại, vì vậy các hành vi tương tự được quan sát cho int thay vì struct X.

EDIT 2 lỗi gcc6 đầy here. ICE không xuất hiện trong phiên bản gcc5 hoặc phiên bản cũ hơn (chỉ các cảnh báo xuất hiện, chính xác).

Trả lời

4

Với dấu ngoặc đơn, loại được tạo mới bắt nguồn từ một loại loại id, trong trường hợp này là X[n]. Đây là mảng có độ dài thay đổi không phải là hành vi tiêu chuẩn. Không có dấu ngoặc đơn, loại được tạo mới là new-type-id, một mảng là X.

+0

Nếu đúng như vậy, mới (buf) (X) và mới (buf) X giống nhau? Cảm ơn –

+0

@KenmanTsang Vâng, nếu đọc của tôi về ngôn ngữ chuẩn là đúng. – 1201ProgramAlarm

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