`const auto` có bất kỳ ý nghĩa nào không?


82

Tôi nghĩ câu hỏi đã đủ rõ ràng. Sẽ các autotừ khóa tự động dò tìm const-Ness, hoặc luôn luôn trả về một kiểu không const, thậm chí nếu có ví dụ. hai phiên bản của một hàm (một trả về constvà một không trả về ).

Chỉ cho bản ghi, tôi sử dụng const auto end = some_container.end()trước vòng lặp for của mình, nhưng tôi không biết liệu điều này có cần thiết hoặc thậm chí khác với bình thường hay không auto.

Câu trả lời:


31

Có thể bạn đang khó hiểu const_iteratorconst iterator. Cái đầu tiên lặp qua các phần tử const, cái thứ hai không thể lặp lại vì bạn không thể sử dụng operators++ và - trên đó.

Lưu ý rằng bạn rất ít khi lặp lại từ container.end(). Thông thường bạn sẽ sử dụng:

const auto end = container.end();
for (auto i = container.begin(); i != end; ++i) { ... }

12
cbegincendtrả về một const_iteratorgiá trị. const autovẫn có mục đích của nó và không thừa.
dalle

2
Vì vậy, const autolà hữu ích trong trường hợp chung này?
rubenvb

@dalle: Tôi đã gỡ bỏ đoạn của tôi trước khi bạn có thể bình luận, sau khi nhận ra rằng tôi đã nói chỉ điều vô nghĩa :)
Benoit

2
Ai đó đã viết quá nhiều sql. :)
Andres Jaan Tack

3
tự động được sửa đổi bởi const như bởi &, nó có thể được sử dụng trong một foreach ví dụ: en.cppreference.com/w/cpp/language/auto
Janosimas

97
const auto x = expr;

khác với

auto x = expr;

như

const X x = expr;

khác với

X x = expr;

Vì vậy, hãy sử dụng const autoconst auto&rất nhiều, giống như bạn sẽ làm nếu bạn không có auto.

Độ phân giải quá tải không bị ảnh hưởng bởi kiểu trả về: consthoặc không có consttrên lvalue xkhông ảnh hưởng đến hàm nào được gọi trong expr.


17
Không. Nếu bạn không định (hoặc phải) sửa đổi biến, nó nên được khai báo const.
Paul J. Lucas

7

Hãy xem xét bạn có hai mẫu:

template<class U> void f1( U& u );       // 1
template<class U> void f2( const U& u ); // 2

autosẽ suy ra kiểu và biến sẽ có cùng kiểu với tham số u(như trong // 1trường hợp), const autosẽ làm cho biến có cùng kiểu với tham số utrong // 2trường hợp. Vì vậy, const autochỉ cần lực lượng constvòng loại.


3

Trình biên dịch suy ra loại cho bộ định tính tự động. Nếu một kiểu suy luận là some_type, const autosẽ được chuyển đổi thành const some_type. Tuy nhiên, một trình biên dịch tốt sẽ kiểm tra toàn bộ phạm vi của autobiến và tìm xem giá trị của nó có thay đổi ở bất kỳ đâu. Nếu không, trình biên dịch sẽ tự suy ra kiểu như thế này: auto-> const some_type. Tôi đã thử điều này trong Visual studio express 2012 và mã máy được tạo ra giống nhau trong cả hai trường hợp, tôi không chắc rằng mỗi và mọi trình biên dịch sẽ làm được điều đó. Tuy nhiên, nó là một thực tiễn tốt để sử dụng const autovì ba lý do:

  • Ngăn ngừa lỗi mã hóa. Bạn dự định không thay đổi biến này nhưng bằng cách nào đó ở đâu đó trong phạm vi của nó, nó bị thay đổi.
  • Khả năng đọc mã được cải thiện.
  • Bạn giúp trình biên dịch nếu vì một lý do nó không suy ra constcho auto.

Trình biên dịch sẽ không suy ra const nếu có thể ... Nó sẽ chỉ thêm const nếu biểu thức mà nó đang suy ra kiểu của chính nó đã là const. Nếu một trình biên dịch chỉ thêm const vì lợi ích của nó, ngữ nghĩa của chương trình có thể bị hỏng, chẳng hạn như các hàm thành viên const so với không phải const được gọi tùy thuộc vào việc trình biên dịch cụ thể có thể suy ra const hay không. Vì vậy, tôi nghĩ rằng điểm cuối cùng của bạn là sai.
rubenvb

@rubenvb Các tiêu chuẩn C ++ cho phép trình biên dịch tổ chức lại mã theo bất kỳ cách nào phù hợp với chúng, tùy thuộc vào tối ưu hóa mong muốn. Đó là hoàn toàn hợp pháp cho một trình biên dịch để suy luận constcho auto nếu nó không được thay đổi chức năng chương trình trong bất kỳ cách nào . Điều đó cũng bao gồm việc kiểm tra xem có sẵn các hàm thành viên const và không const. Trình biên dịch sẽ làm điều đó đúng.
BJovke
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.