template<typename T>
void print_size(const T& x)
{
std::cout << sizeof(x) << '\n';
}
int main()
{
print_size("If you timidly approach C++ as just a better C or as an object-oriented language, you are going to miss the point.");
// prints 115
}
Điều này in 115 trên trình biên dịch g ++ gần đây. Vì vậy, rõ ràng, T
được suy luận là một mảng (thay vì một con trỏ). Hành vi đó có được đảm bảo theo tiêu chuẩn không? Tôi hơi ngạc nhiên, bởi vì đoạn mã sau in kích thước của một con trỏ, và tôi nghĩ rằng auto
hoạt động chính xác như khấu trừ đối số mẫu?Trích đối số mẫu cho các chuỗi ký tự
int main()
{
auto x = "If you timidly approach C++ as just a better C or as an object-oriented language, you are going to miss the point.";
print_size(x);
// prints 4
}
Không phải bây giờ cho trước nhưng sau này không phải là bất ngờ. Chuỗi literals LÀ mảng, phải không? – Tomek
Đối với bất cứ ai đọc điều này, những người không biết: bạn không thể vượt qua mảng theo giá trị (họ phân rã thành con trỏ) nhưng bạn chắc chắn có thể vượt qua một tham chiếu đến một mảng. Ở đây, 'const T &' trở thành một tham chiếu đến một mảng và vì vậy 'sizeof' cho kích thước của mảng. –
Câu trả lời của Martinho bao gồm câu hỏi chính. Đối với hành vi được bảo đảm, 14.8.2.1/2: "Nếu' P' không phải là kiểu tham chiếu: Nếu 'A' là một kiểu mảng, kiểu con trỏ được tạo bởi chuyển đổi tiêu chuẩn mảng thành con trỏ được sử dụng thay cho 'A' cho loại khấu trừ; ..." trong đó 'P' là kiểu tham số hàm của hàm mẫu có thể liên quan đến một hoặc nhiều tham số mẫu và' A' là loại biểu thức được sử dụng trong lệnh gọi hàm. – aschepler