Động lực và cạm bẫy (?) Của từ khóa tự động trong C ++ 11


20

Gần đây tôi đã tự hỏi tại sao từ khóa autođược chọn trong C ++ 11 để đánh dấu một biến có loại phải được trình biên dịch suy ra, như trong

auto x = 1;

Kể từ khi

  1. var dường như phổ biến hơn trong các ngôn ngữ lập trình khác (ví dụ: C #, Scala, JavaScript) và
  2. Theo như tôi hiểu về ngữ nghĩa mới của sự autophá vỡ tính tương thích ngược (nó hiếm khi được sử dụng nhưng có ý nghĩa khác trong các phiên bản trước của C ++, xem ví dụ ở đây )

Tôi muốn hỏi nếu có một lý do đặc biệt để lựa chọn auto(ủng hộ varhoặc bất kỳ từ khóa nào khác). Có cuộc thảo luận cụ thể nào về vấn đề này trước khi tiêu chuẩn C ++ 11 được phát hành không?

Ngoài ra, có bất kỳ sự không tương thích nào có thể xảy ra mà chúng ta nên đề phòng khi biên dịch lại mã C ++ kế thừa với trình biên dịch C ++ 11 không?


9
Các ngữ nghĩa mới autocó thể phá vỡ tính tương thích ngược, nhưng, tùy thuộc vào mức độ thường xuyên varđược sử dụng làm tên biến so với tần suất autosử dụng từ khóa trong mã trước 11, ủy ban có thể cho rằng nó phá vỡ tính tương thích ít hơn so với giới thiệu mới từ khóa sẽ.
sepp2k

2
"Vì hiện tại, câu hỏi này không phù hợp với định dạng Hỏi và Đáp của chúng tôi. Chúng tôi hy vọng câu trả lời sẽ được hỗ trợ bởi các sự kiện, tài liệu tham khảo hoặc chuyên môn cụ thể, nhưng câu hỏi này có thể sẽ thu hút tranh luận, tranh luận, bỏ phiếu hoặc thảo luận mở rộng. bạn cảm thấy rằng câu hỏi này có thể được cải thiện và có thể mở lại, hãy xem Câu hỏi thường gặp để được hướng dẫn. ": Câu hỏi này đang hỏi về một thực tế: đã có một cuộc thảo luận về chủ đề này. Có hai câu trả lời có thể có: CÓ và KHÔNG.
Giorgio

2
Tất nhiên đã có một cuộc thảo luận, làm cho câu hỏi trở nên vô nghĩa trong vấn đề đó. Câu hỏi autovs varlà 90% văn bản của bạn đề cập đến điều gì và câu hỏi đó không có kết quả rõ ràng. (mặc dù tôi không phải là người đã bỏ phiếu đóng cửa)
Telastyn

1
@Telastyn: Nếu tôi biết rằng đã có một cuộc thảo luận về chủ đề này, tôi sẽ không hỏi. Googling cho "auto vs. var C ++" hoặc "auto C ++" không trả lại gì về chủ đề này.
Giorgio

1
autođã được đề xuất cho C ++ trước khi varđược giới thiệu trong C #, vì vậy câu hỏi đặt ra là tại sao C # không sử dụng auto. var có một ý nghĩa khác trong JavaScript và Scala
adrianm

Câu trả lời:


37

Hầu như mọi từ bạn có thể nghĩ đến khi thêm làm từ khóa cho một ngôn ngữ gần như chắc chắn đã được sử dụng làm tên biến hoặc một phần khác của mã làm việc. Mã này sẽ bị phá vỡ nếu bạn biến từ đó thành một từ khóa.

Điều cực kỳ may mắn autolà nó đã là một từ khóa, vì vậy mọi người không có biến với tên đó, nhưng không ai sử dụng nó, vì đó là mặc định. Tại sao gõ:

auto int i=0;

khi nào

int i=0;

có nghĩa chính xác điều tương tự?

Tôi cho rằng ở đâu đó trên hành tinh này có một số lượng nhỏ mã được sử dụng 'tự động' theo cách cũ. Nhưng nó có thể được sửa bằng cách xóa 'auto' và nó sẽ hoạt động trở lại. Vì vậy, nó là một lựa chọn khá rõ ràng để sử dụng lại từ khóa.

Tôi cũng nghĩ rằng đó là một ý nghĩa rõ ràng hơn. Nếu bạn đã làm việc với các biến thể và như vậy, khi bạn thấy varbạn có thể nghĩ rằng khai báo bằng cách nào đó ít được gõ mạnh hơn so với khi bạn tự nhấn tất cả các phím trên bàn phím để chỉ định loại biến. Đối với tôi, autolàm rõ hơn rằng bạn đang yêu cầu trình biên dịch tự động suy ra loại, nó mạnh như thể bạn đã tự chỉ định nó. Vì vậy, nó thực sự là một sự phá vỡ rất may mắn đã tạo ra một cái tên tốt cho ủy ban.

Để làm rõ sự phá vỡ (nhỏ):

Nếu bạn có

auto int i=0;

và đã cố gắng biên dịch với trình biên dịch C ++ 11, bây giờ bạn sẽ gặp lỗi như

lỗi C3530: 'tự động' không thể được kết hợp với bất kỳ trình xác định loại nào khác

Điều này là không quan trọng, bạn chỉ cần loại bỏ tự động hoặc int và biên dịch lại.

Có một vấn đề lớn hơn mặc dù. Nếu bạn có

auto i = 4.3;

C và C ++ thực sự cũ sẽ tạo ra imột int(như thể nếu bạn rời khỏi auto- khai báo mặc định là int). Nếu bạn đã trải qua một thời gian dài mà không biên dịch mã này, hoặc đã sử dụng các trình biên dịch cũ, bạn có thể có một số mã này, ít nhất là trên lý thuyết. C ++ 11 sẽ làm cho nó trở thành doublevì đó là 4.3. (Hoặc có thể là float, tôi vẫn đang ở chế độ Boxing Day, nhưng vấn đề là, không phải int.) Điều này có thể giới thiệu các lỗi tinh vi trong ứng dụng của bạn. Và không có bất kỳ cảnh báo hoặc lỗi từ trình biên dịch. Những người trong chiếc thuyền này nên tìm kiếm trên toàn cầu autođể đảm bảo rằng họ không sử dụng nó theo cách cũ trước khi họ chuyển sang trình biên dịch C ++ 11. May mắn thay, mã như vậy là cực kỳ hiếm.


Cảm ơn cho một câu trả lời rất rõ ràng. +1 Tôi hiểu sự đánh đổi giữa việc giảm khả năng tương thích ngược theo cách gần như vô hại và có khả năng lớn là mã cũ không bị phá vỡ bởi từ khóa mới.
Giorgio

Có thực sự có bất kỳ sự không tương thích nào không? Trình biên dịch C ++ 11 sẽ không bỏ qua autonếu nó được theo sau bởi một loại tên?
aaaaaaaaaaaa

1
Visual C ++ 2012 nói error C3530: 'auto' cannot be combined with any other type-specifiervới dòng đó
Kate Gregory

3
@KateGregory: Thật ra, không có vấn đề gì auto i = 4.3;, vì điều đó không được định hình trong C ++ 03 / C ++ 98. C ++ đã không thực hiện quy tắc 'ngầm định' mà C89 đã có (và bỏ trong bản sửa đổi C99).
Bart van Ingen Schenau 27/12 '

1
@Kate Gregory: Nếu bạn có thể tính đến các quan sát của Bart và thay đổi câu trả lời của mình cho phù hợp, tôi sẽ đánh dấu nó là câu trả lời được chấp nhận.
Giorgio
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.