7

Tôi đang viết một hàm chung chung như dưới đây.C++ về việc khởi tạo chung trong các mẫu

template<class Iterator, class T> 
void foo(Iterator first, Iterator last) { 
    T a; 
    cout << a << endl; 
    // do something with iterators 
} 

typedef vector<double>::iterator DblPtr; 
vector<double> values; 
foo< DblPtr, int>(); 

chức năng này in ra một giá trị xác định cho biến a, trong khi nếu tôi thay đổi khởi tạo vào

/// 
    T a = T() 
    cout << a << endl; 
    // do something with iterators 

tôi có thể thấy rằng giá trị khởi tạo là 0 như tôi mong đợi.

Nếu tôi gọi T a biến được khởi tạo với giá trị mặc định, nhưng nếu tôi gọi T a = T() Tôi tin rằng do tối ưu hóa các nhà xây dựng bản sao nên được gọi với giá trị của T() đó vẫn là một sự mặc định.

Tôi không thể hiểu sự khác biệt đằng sau 2 dòng này và lý do tại sao điều này xảy ra?

Trả lời

11

Trước hết, việc khởi tạo mặc định các loại được cài sẵn như int khiến chúng không được khởi tạo. Giá trị khởi tạo để chúng không được khởi tạo. Như ví dụ của bạn

Đây là một khởi tạo mặc định:

T a; 

Đây là một khởi giá trị, sử dụng copy initialization:

T a = T(); 

Bạn có phải là bản sao có thể được elided đây, vì vậy đây có ảnh hưởng của việc tạo một đối tượng T được khởi tạo giá trị duy nhất. Tuy nhiên, nó yêu cầu rằng T có thể sao chép hoặc di chuyển được. Đây là trường hợp với các kiểu tích hợp, nhưng đó là một hạn chế cần ghi nhớ.

Cú pháp khởi tạo bản sao là cần thiết vì đây là một khai báo hàm:

T a(); 

nhưng C++ 11 cho phép bạn khởi tạo giá trị gia như thế này:

T a{}; 
+0

vĩ đại giải thích! Tất cả rõ ràng bây giờ và cảm ơn rất nhiều. –

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