2012-11-04 25 views
8
void f(int count, ...){ 
    //whatever 
} 

struct somestruct{ 
    size_t a, b, c; 
}; 

int main() { 
    somestruct s; 
    f(1, s); //what is actually passed? 
} 

Toàn bộ struct được sao chép và chuyển vào ngăn xếp chưa? Nếu vậy thì các nhà xây dựng sao chép được gọi là? Con trỏ có được truyền không? Điều này có an toàn không?điều gì xảy ra nếu tôi chuyển cấu trúc cho hàm vararg?

+0

Bạn phải hỏi về C++; C không có các hàm tạo bản sao. –

Trả lời

2

Có, nếu bạn vượt qua một giá trị trái, vế trái để chuyển đổi rvalue sẽ được thực hiện, có nghĩa là kêu gọi các nhà xây dựng bản sao để sao chép các đối tượng vào một bản sao mới và chuyển nó như một đối số.

+0

Vâng ... nhưng nếu bạn vẫn có ràng buộc rằng loại phải được trivially có thể sao chép (và bạn làm, 'g ++' kết quả đầu ra một lỗi nếu không), sau đó câu trả lời của bạn và billz là tương đương ... hay không? –

+0

@LorenzoPistone no. trình tạo bản sao có thể bị xóa hoặc riêng tư. nó sẽ không nhất thiết là không tầm thường, nhưng gọi nó sẽ bị hình thành. –

1

void f(...) đang sử dụng bản sao được bit. Không có hàm khởi tạo hoặc bản dựng khởi tạo mặc định nào sẽ được tạo cho somestruct vì nó chỉ có các kiểu dựng sẵn C++.

Is this safe? 

Vâng, điều này là hoàn toàn an toàn.

Tôi sẽ giới thiệu bạn đến 'Bên trong C++ mô hình đối tượng' chapter 2 The Semantics of Constructors

+0

Bạn có một số tham chiếu? –

+0

Tôi nhận thấy rằng cấu trúc phải được sao chép một cách đáng kể. –

+0

@LorenzoPistone: cấu trúc phải là loại POD. –

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