2010-11-18 14 views
35

Mã sau hoạt động tốt, nhưng tại sao mã này chính xác? Tại sao con trỏ "c_str()" của tạm thời được trả về bởi foo() hợp lệ? Tôi nghĩ, rằng tạm thời này đã bị phá hủy khi bar() được nhập vào - nhưng nó không có vẻ như thế này. Vì vậy, bây giờ tôi giả định rằng tạm thời trở lại bởi foo() sẽ bị phá hủy sau khi cuộc gọi đến bar() - là điều này đúng? Và tại sao?Thời gian tồn tại của thời gian

std::string foo() { 
    std::string out = something...; 
    return out; 
} 

void bar(const char* ccp) { 
    // do something with the string.. 
} 

bar(foo().c_str()); 

Trả lời

42

$ 12,2/3- "đối tượng tạm thời được bị phá hủy như là bước cuối cùng trong đánh giá đầy đủ biểu thức (1.9) đó (giải nghĩa từ vựng) chứa các điểm nơi chúng được tạo ra. Điều này đúng ngay cả khi đánh giá đó kết thúc bằng ném một ngoại lệ. "

Vòng đời tạm thời được trả về bởi foo() kéo dài cho đến khi kết thúc biểu thức đầy đủ nơi nó được tạo cho đến khi kết thúc hàm gọi là 'bar'.

EDIT 2:.

$ 1,9/12- "Một đầy đủ thể hiện là một biểu hiện đó không phải là một subexpression biểu hiện khác Nếu một ngôn ngữ xây dựng được xác định để tạo ra một gọi ngầm của một hàm, sử dụng cấu trúc ngôn ngữ được coi là là một biểu thức cho các mục đích của định nghĩa này. "

+1

cũng lưu ý rằng 'c_str()' chỉ trả về một con trỏ * tạm thời *. Tuổi thọ của nó không nói gì về tuổi thọ của dữ liệu mà nó chỉ ra. – jalf

+4

'c_str()' không trả về tạm thời. Nó trả về một rvalue của kiểu con trỏ. Các giá trị của kiểu con trỏ không phải là các đối tượng. Họ không có cả đời. –

61

Một đối tượng tạm thời bị hủy khi biểu thức đầy đủ chứa giá trị rvalue mà đánh giá đã tạo đối tượng tạm thời đó được đánh giá hoàn toàn. Hãy để tôi minh họa bằng nghệ thuật ASCII:

____________________ full-expression ranges from 'b' to last ')' 
bar(foo().c_str()); 
    ^^^^^  ^
     |   | 
    birth  funeral 
+9

Các hình minh họa ẩn dụ bên trong nghệ thuật ASCII :) rất minh họa. Tôi thực sự thích họ – Chubsdad