2008-10-31 33 views
6

Có ai từng thấy lớp lưu trữ tự động sử dụng trong c/C++ không? Nếu vậy, trong tình huống nào?auto c/C++

Trả lời

23

tự động không bao giờ hữu ích trong C/C++ hiện tại vì tất cả các biến đều tự động ẩn. Nó rất hữu ích trong C++ 0x, nơi nó có thể thay thế hoàn toàn việc khai báo kiểu - nếu bạn có một biến có gán ban đầu, 'tự động' sẽ chỉ làm cho nó là kiểu giá trị gán, như trong các chú thích.

+0

Ông có thể bao gồm một ví dụ về C++ 0x sử dụng không? – c0m4

+2

auto funcptr = std :: tr1 :: bind (& Foo :: Bar, this, _1, _2); Điều này tuyên bố "funcptr" có cùng kiểu như trả về "bind" (đây là một kiểu phức tạp nghiêm trọng), trong những ngày cũ, bạn sẽ bọc nó trong một mẫu std :: tr1 :: nhưng với auto bạn don không cần phải làm điều đó nữa). –

+0

Đây có phải là trường hợp đặc biệt hay không hoạt động tổng quát hơn, chẳng hạn như tự động someVar = functionThatReturnsUnknownType(); ? – c0m4

1

Không, giả định nếu bạn bỏ qua trình chỉ định lớp. Cách sử dụng hợp lý duy nhất mà tôi có thể nghĩ đến là gọi sự chú ý đến một biến cục bộ cụ thể ghi đè, nói, một biến toàn cục có cùng tên, hoặc như một câu hỏi phỏng vấn.

Rất có thể, bạn sẽ nhầm lẫn giữa lập trình viên kém, những người bị kẹt khi duy trì mã!

4

Tôi chưa thấy auto được sử dụng trong mã được viết trong 10 năm qua. Không có lý do gì để sử dụng auto vì chỉ những địa điểm bạn mới có thể sử dụng số là nó được ngụ ý ở đâu. Lý do duy nhất nó vẫn tồn tại là cho khả năng tương thích ngược nhưng cần tránh trong mã mới.

5

tự động là tốt cho tuyên bố xe :-)

+2

hoặc eroticAsphyxiation – fizzer

+0

làm thế nào bạn quản lý để kéo này, và vẫn nhận được 2 phiếu bầu lên ?! 1 thêm từ tôi. – aiao

1

Như Alex đã được bảo hiểm, ô tô được sử dụng trong C++ 0x để khai báo các loại trong tờ khai khởi nơi các loại được suy ra từ mã khởi động.

Có đề xuất cho nó cũng được sử dụng làm kiểu trả về, trong đó loại được suy ra từ mã trả về một giá trị. Tuy nhiên điều này đã dẫn đến một sự mơ hồ như vậy, tại thời điểm viết, một cái gì đó phù hợp hơn với cú pháp lambda C++ 0x đang được xem xét.

3

Trong GCC bạn có thể cần tự động khai báo hàm lồng nhau để có thể xác định nó bất cứ nơi nào trong cơ thể của chức năng - xem http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Nested-Functions.html

+0

Ngay ở đầu trang đó, nó nói rằng các hàm lồng nhau không được hỗ trợ cho GNU C++. Vậy công cụ tự động liên quan đến các hàm lồng nhau có áp dụng cho các cài đặt khác của C++ không? – c0m4

+0

@ c0m4: Sẽ an toàn nhất để giả định rằng các phần mở rộng của GNU C như các hàm lồng nhau không có sẵn với các trình biên dịch khác. –

2

Dưới đây là một ví dụ từ mã của tôi, viết bằng C++ 11:

c_srgb find_in_book(const c_HVC &HVC) { 
    auto b = munsell.mun_to_rgb_book.find(HVC); 
    if(b != munsell.mun_to_rgb_book.end()) { 
     c_srgb f = b->second; 
     return f; 
    } else { 
     c_srgb ret; 
     ret.r=ret.g=ret.b=0; 
     return ret; 
    } 
} 

tôi thích đó đến nay:

c_srgb find_in_book(const c_HVC &HVC) { 
std::_Tree_iterator<std::_Tree_val<std::_Tmap_traits<dj::color::c_HVC,dj::color::c_srgb,std::less<dj::color::c_HVC>,std::allocator<std::pair<const dj::color::c_HVC,dj::color::c_srgb>>,false>>> b = munsell.mun_to_rgb_book.find(HVC); 
    if(b != munsell.mun_to_rgb_book.end()) { 
     c_srgb f = b->second; 
     return f; 
    } else { 
     c_srgb ret; 
     ret.r=ret.g=ret.b=0; 
     return ret; 
    } 
}