Trong khi gỡ lỗi một số mã của chúng tôi (C++) Tôi thấy điều này:lạ reinterpret_cast (dấu phẩy tách ra biểu thức)
inline std::string BufferToStr(
const unsigned char* buffer,
int index,
size_t length)
{
std::string retValue(reinterpret_cast<const char*>(&buffer[index], length));
return retValue;
}
Vấn đề với mã này (nhìn ra thiếu con trỏ và dài chuỗi kiểm tra) là đóng cửa dấu ngoặc đơn của số reinterpret_cast
đã được đặt sau length
khi cần sau &buffer[index]
. Lúc đầu, tôi nghĩ rằng đây là một vấn đề với trình biên dịch (sử dụng VS2013) nhưng sau khi biên dịch thành công bằng cách sử dụng cả hai VS2012 và gcc 4.6.3, tôi đã đi đến kết luận rằng đây là vì lý do nào đó được cho phép. Mã sẽ không chạy trên Windows hoặc Linux vì tham số chiều dài được sử dụng làm con trỏ.
Vì vậy, câu hỏi của tôi là tại sao tính toán này? Nhìn vào tài liệu của reinterpret_cast
Tôi không thể tìm thấy bất kỳ tài liệu nào về nó nói rằng bạn có thể chuyển danh sách giá trị được phân cách bằng dấu phẩy cho nó và nó sẽ làm gì với nó.
Tại sao nó không biên dịch? Bạn đang yêu cầu trình biên dịch tạo một 'size_t' thành' const char * 'và nó thực hiện điều đó. Nó không cần phải có ý nghĩa để được cho phép. – Damon
Lưu ý rằng việc bật cảnh báo sẽ đưa ra một dấu hiệu mạnh mẽ về những gì đang diễn ra như tôi đã trình bày trong câu trả lời của tôi với ví dụ sử dụng 'gcc'. –