2011-08-18 28 views
13

Trong C++ 0x (ohh! Đọc C++ 11), chúng ta có suy luận kiểu tự động. Một điều khiến tôi tò mò là tôi không thể tạo ra một mảng các biến tự động. Ví dụ:Tại sao tôi không thể tạo một mảng các biến tự động?

auto A[] = {1, 2, 3, 4}; // Error! 

Bất kỳ ý tưởng nào tại sao điều này có thể không được phép?

+3

Tại sao tất cả mọi người muốn lợi dụng các tính năng ngôn ngữ mới. –

+3

@Martin: Tôi hoàn toàn không có ý định lạm dụng một ngôn ngữ rất đẹp như C++. Tôi chỉ tò mò về những lý do (kỹ thuật, đạo đức, vv) đằng sau quyết định này. –

+2

@Martin: Bạn phải chạm vào các bề mặt để biết tường ở đâu trước khi bắt đầu chạy một cách mù quáng. – Klaim

Trả lời

10

auto khấu trừ mọi danh sách bộ khởi tạo kèm theo ngoặc đơn thành std::initializer_list<T>. (Xem §7.1.6.4.6 bao gồm ví dụ). Thật không may là bạn không thể khởi tạo một mảng hoặc thậm chí std::array từ một std::initializer_list khi bạn đã nhận được nó, nhưng bạn có thể sử dụng std::vector.

#include <vector> 
#include <array> 
#include <initializer_list> 

int main() 
{ 
    auto x = {1,2,3}; 
    std::array<int, 3> foo1 = x; // won't work for whatever reason 
    std::vector<int> foo2 = x; // works as expected 
    return 0; 
} 

Tất nhiên điều này đánh bại toàn bộ mục đích của những gì bạn đang cố gắng làm.

Tôi cố gắng viết một công trình xung quanh gọi là make_array nhưng đã phải nhận ra rằng đây không thể bao giờ làm việc như kích thước của một initializer_list không phải là một phần của các đối số mẫu của nó và vì vậy bạn chỉ thể hiện hóa một make_array mẫu cho mỗi T. Điều này hút.

template<typename T> 
auto make_array(const std::initializer_list<T>& x) 
    -> std::array<T, x.size()> { } // maaah 

Vâng, rõ ràng là bạn có thể đi cho variadic-template Hack đề cập ở đây How do I initialize a member array with an initializer_list?

5

Bởi vì {1, 2, 3, 4} hoàn toàn là một cấu trúc cú pháp - nó không phải là một biểu thức và không có loại. Do đó, auto không thể suy ra loại của nó từ nó.

+2

Thật là xấu hổ, tôi biết các ngôn ngữ đã có thể làm điều đó trong nhiều năm – hamstergene

+4

Nhưng 'auto x = {1,2}' khai báo 'x' thành' std :: initializer_list '. Vì vậy, điều này là không chính xác sự thật. – pmr

+1

@DeadMG: Ok, vậy bạn nghĩ gì về auto x = {1, 2, 3, 4} ;? Nó có hoạt động hay không? Giá trị nào x sẽ chứa? Nếu x là 1, thì trình biên dịch đã loại bỏ kiểu của nó như thế nào bây giờ? –

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