2010-06-30 61 views
22

Tôi có một chức năng,C++ Đối số mặc định cho vector <int> &?

void test(vector<int>& vec); 

Làm thế nào tôi có thể thiết lập các tham số mặc định cho vec? Tôi đã thử

void test(vector<int>& vec = vector<int>()); 

Nhưng có một cảnh báo "mở rộng không chuẩn được sử dụng: 'đối số mặc định': chuyển đổi từ 'std :: vector < _Ty>' thành 'std :: vector < _Ty> &"

Có cách nào tốt hơn để thực hiện việc này không? Thay vì

void test() { 
    vector<int> dummy; 
    test(dummy); 
} 

Kính trọng, Voteforpedro

Trả lời

43

Các bạn đã thử:

void test(const vector<int>& vec = vector<int>()); 

C++ không cho phép là tạm thời bị ràng buộc để tham khảo không const.

Nếu bạn thực sự cần phải có một vector<int>& (không phải là const một), bạn có thể khai báo một phiên bản tĩnh và sử dụng nó làm giá trị mặc định (do đó không phải tạm thời).

static vector<int> DEFAULT_VECTOR; 

void test(vector<int>& vec = DEFAULT_VECTOR); 

Nhưng hãy cẩn thận, vì DEFAULT_VECTOR (có thể) được sửa đổi và không đặt lại trên mỗi cuộc gọi! Không chắc chắn rằng đây là những gì bạn thực sự muốn.


Nhờ stinky472, đây là một thread-safe thay thế:

Thay vì cung cấp một giá trị mặc định, bạn cũng có thể quá tải test() với một phiên bản zero-tham số trong đó kêu gọi các phiên bản khác:

void test() 
{ 
    vector<int> vec; 
    test(vec); 
} 
+4

+1 nhưng tôi nghĩ rằng nó nên được chỉ ra rằng 'thử nghiệm' nói chung sẽ không được thread-an toàn là nó để sửa đổi này 'DEFAULT_VECTOR'. Nó có thể là tẻ nhạt, nhưng tôi khuyên bạn nên viết hai chức năng cho các nhu cầu như vậy (một có thể tái sử dụng khác): void test() {vector temp; kiểm tra (temp); } – stinky472

+0

@ stinky472: Cảm ơn, đã cập nhật câu trả lời của tôi. – ereOn

+1

Như một lưu ý phụ, có một cách hacky để nhận được một tham chiếu đến một tạm thời nếu bạn có thể sử dụng một số phương pháp trên sau đó trả về một tham chiếu như vậy cho chính nó ... ví dụ 'operator ='. Vì vậy, 'kiểm tra void (vector & vec = vector () .operator = (vector ()));' nên hoạt động (tuổi thọ của tạm thời không bị ảnh hưởng ở đây và sẽ vẫn đủ để xử lý cuộc gọi). Nhưng xin đừng làm điều đó :) –

7

Tôi thấy có vấn đề với đối số tham chiếu không phải là const để có giá trị mặc định. cái này có nghĩa là gì chứ?

Thông thường, hàm sử dụng tham chiếu không phải là const có nghĩa là "Tôi có thể thay đổi đối số". Nếu đối số là tùy chọn tại sao không vượt qua con trỏ (không phải là const)? Bằng cách đó, khi người gọi không muốn vượt qua một đối số, họ có thể vượt qua NULL.
(Xem here để biết thêm thông tin về làm thế nào để vượt qua đối số chức năng.)

Edit: Vâng, và tất nhiên, cũng có quá tải. Chỉ cần thêm một tình trạng quá tải khác mà không có đối số này.

+0

Bạn thấy nó có vấn đề? – Puppy

+3

@DeadMG: Bạn đang đề cập đến hệ thống phụ ngữ pháp bị hỏng của tôi? – sbi

+1

Tôi có làm điều gì đó như thế không? – Puppy

3

Chúng tôi không thể khởi tạo các tham chiếu có thể thay đổi thành thời gian. Chỉ tham chiếu const cho phép điều này.Những gì bạn đang có sau đây rất có thể là:

void test(const vector<int>& vec = vector<int>()); 

Ngoài tránh hành vi không xác định, điều này có ý nghĩa hợp lý nhất và từ góc độ chính xác const. Nếu bạn muốn 'thử nghiệm' để sửa đổi vectơ ban đầu được truyền cho nó, bạn sẽ không thể cung cấp một giá trị mặc định một cách hợp lý. Vì vậy, rõ ràng là bạn đang sử dụng 'vec' ở đây cho các mục đích chỉ đọc và do đó làm cho nó trở thành tham chiếu const.

+2

Bạn không thể khởi tạo các tham chiếu có thể thay đổi trực tiếp đến thời gian, thời gian. Một tạm thời sẽ không liên kết với một tham chiếu-không-const - nếu bạn thử điều đó, nó không phải là U.B., đó là đầu vào không đúng định dạng (tức là lỗi trình biên dịch). VC++ cho phép bạn làm điều này, nhưng đúng là lưu ý rằng nó là một phần mở rộng ngôn ngữ. –

+0

@Pavel ah điểm tốt! Tôi đã nhìn thấy trình biên dịch khó chịu cho phép hành vi này như MSVC và các phiên bản trước đây của CodeWarrior nơi mã được xây dựng nhưng bị lỗi. Tôi sẽ sửa đổi bài viết cho phù hợp với độ chính xác. Cảm ơn đã chỉ ra điều đó. – stinky472

-1

Tôi biết câu hỏi này đã được hỏi trong năm 2010 nhưng đối với C++ 11 bạn có thể làm điều đó như thế này:

void test(vector<int>& vec = {}) { 
     // Awesome code here 
} 

Như đã chỉ ra trong this answer.

+0

Điều này có nghĩa giống như 'kiểm tra void (vector & vec = vector ());' như trong câu hỏi, đó là bất hợp pháp do cố gắng ràng buộc tạm thời với tham chiếu không const. Trong câu trả lời bạn liên kết đến, nó không phải là một tham chiếu. –

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