2011-01-26 30 views
5

Trong mã của tôi, có lỗi đánh máy: thay vì sử dụng "false" khi khởi tạo đối tượng std::string, tôi đã nhập false (là bool). Bây giờ điều này không báo cáo bất kỳ lỗi biên dịch nào. Nhưng sau đó trong mã của tôi, khi đối tượng chuỗi này đang được sử dụng, tôi nhận được std::logic_error trong thời gian chạy. Bất cứ ai có thể vui lòng giải thích, tại sao xây dựng được cho phép trong trường hợp này (nếu không tôi đã nhận được một lỗi biên dịch và tìm thấy vấn đề đó)?loại chuyển đổi nào đang diễn ra khi một giá trị boolean được sử dụng để xây dựng một đối tượng chuỗi?

Dưới đây là một đoạn nhỏ -

#include <iostream> 

int main() 
{ 

    std::string str = false; 

    std::cout << str << "\n"; 

} 

Các o/p mà tôi nhận được khi chạy này -

[email protected]~/MYBACKUP=>g++ -o test_string -g test_string.cxx 

[email protected]~/MYBACKUP=>./test_string 

terminate called after throwing an instance of 'std::logic_error' 
    what(): basic_string::_S_construct NULL not valid 
Aborted 

Trả lời

8

std::string có một constructor mà phải mất một const char* thành một chuỗi null-chấm dứt.

false có thể được sử dụng dưới dạng hằng số null-con trỏ vì nó là biểu thức hằng số không đổi với giá trị bằng 0, vì vậy hàm tạo std::string được sử dụng.

Truyền con trỏ null tới hàm tạo này mang lại hành vi không xác định. Việc triển khai Thư viện chuẩn của bạn giúp bạn ở đây bằng cách tạo ra một ngoại lệ logic_error để thông báo cho bạn rằng bạn đã vi phạm các ràng buộc của hàm tạo std::string bằng cách chuyển cho nó một con trỏ rỗng. Các triển khai khác có thể không hữu ích (bạn có thể gặp sự cố hoặc hỏng dữ liệu ngay lập tức hoặc ai biết điều gì).

+0

ok. Nhưng không phải điều này đã dẫn đến một lỗi biên dịch thời gian? (thay vì bắt lỗi sau này trong thời gian chạy) – anindita

+1

@anindita: Không. 'false' có thể sử dụng như hằng số con trỏ null (giống như' 0' hoặc 'NULL' nếu bạn' #include ') và một con trỏ rỗng hằng số có thể được sử dụng như một 'const char *', do đó, hàm tạo 'std :: string' sử dụng' const char * 'có thể được sử dụng. –

+0

ok ... cảm ơn lời giải thích. – anindita

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