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).
Nếu đúng như vậy, mới (buf) (X) và mới (buf) X giống nhau? Cảm ơn –
@KenmanTsang Vâng, nếu đọc của tôi về ngôn ngữ chuẩn là đúng. – 1201ProgramAlarm