Hãy xem xét đoạn mã sau:Non-tĩnh thành viên khởi tạo của mảng char với cú đúp đưa ra một lỗi trong gcc trong khi không ở kêu vang
#include <iostream>
class A
{
char name[40] = { "Blank" }; // note the braces here
public:
const char *getName() { return name; }
};
int main()
{
A a;
std::cout << a.getName() << std::endl;
}
Nó cung cấp cho một lỗi trong gcc
(phiên bản mới nhất 5.2.0
):
prog.cpp:5:28: error: invalid conversion from 'const char*' to 'char' [-fpermissive]
char name[40] = { "Blank" };
^
Nhưng nó không phải là trường hợp cho clang
, mà biên dịch nó hoàn hảo với -std=c++11 -pedantic -Wall
.
Có thực sự không chính xác khi đặt dấu ngoặc đơn cho trình khởi tạo không tĩnh ở đây?
AFAIR không quan trọng nếu niềng răng có mặt hay không. Ví dụ, định nghĩa của mảng, chẳng hạn như:
char text[] = "some text";
tương đương với:
char text[] = { "some text" };
không phải là cùng một contraption trình biên dịch cho phép chúng tôi khởi tạo tăng :: mảng tổng hợp với chỉ một cú đúp chiều sâu thay vì hai? –
Sẽ không '{" một số văn bản "}' khởi tạo một mảng các chuỗi, chẳng hạn như 'char arrayOfStrings [] [] = {" một số văn bản "};' với phần tử đầu tiên có chứa một con trỏ tới "" một số văn bản "' ? – muXXmit2X
@ muXXmit2X Đó cũng là suy nghĩ đầu tiên của tôi, nhưng như câu hỏi được chỉ ra, nó không thay đổi bất cứ điều gì nếu bạn làm điều đó bên trong một chức năng. – Telokis