2012-11-09 50 views
6
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 
} 
+1

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

+2

Đố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. –

+1

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

Trả lời

8

auto cư xử chính xác như khấu trừ mẫu tranh cãi. Chính xác như T!

Hãy so sánh này:

template<typename T> 
void print_size(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 4 
    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 
} 

Với điều này:

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 
    const 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 115 
} 

Không hẳn, nhưng đây không phải là một trong những trường hợp góc.

+0

Ngớ ngẩn tôi. Cảm ơn bạn đã nâng bức màn :) – fredoverflow

+0

Bởi vì, tất nhiên, bạn không thể vượt qua một mảng kiểu C làm giá trị trong C++. – Yakk

+0

@Yakk: Thật vậy, vì điều đó sẽ phá vỡ tính tương thích của C. C không có tài liệu tham khảo, do đó, không có hành vi hiện có để phá vỡ ở đó. – MSalters

Các vấn đề liên quan