Chuẩn C++ như int hay char có ctors, vì vậy bạn có thể có biểu hiện như:Đi qua một biến ẩn danh bằng cách tham khảo
int a = int(67); // create anonymous variable and assing it to variable a
int b(13); // initialize variable b
int(77); // create anonymous variable
Người dùng xác định loại (cấu trúc hoặc các lớp học) có thể làm tương tự:
struct STRUCT
{
STRUCT(int a){}
};
STRUCT c = STRUCT(67);
STRUCT d(13);
STRUCT(77);
Câu hỏi đặt ra là: tại sao chúng ta có thể chuyển qua cấu trúc ẩn danh tham chiếu hoặc phiên bản lớp, nhưng không thể vượt qua các loại tiêu chuẩn?
struct STRUCT
{
STRUCT(int a){}
};
void func1(int& i){}
void func2(STRUCT& s){}
void func3(int i){}
void func4(STRUCT s){}
void main()
{
//func1(int(56)); // ERROR: C2664
func2(STRUCT(65)); // OK: anonymous object is created then assigned to a reference
func3(int(46)); // OK: anonymous int is created then assigned to a parameter
func4(STRUCT(12)); // OK: anonymous object is created then assigned to a parameter
}
Dòng 'func2' của bạn không được biên dịch (vì lý do tương tự như đầu tiên). – Mat
'void main()' không chuẩn. –
Với mức cảnh báo thích hợp, bạn sẽ nhận được 'cảnh báo C4239: phần mở rộng không chuẩn được sử dụng: 'đối số': chuyển đổi từ 'STRUCT' thành 'STRUCT &'; Tham chiếu không phải const chỉ có thể được liên kết với một giá trị '. Bạn nên sử dụng '/ W4'. –