Điều gì sẽ 'std:;' làm gì trong c ++?


89

Gần đây tôi đang sửa đổi một số mã và tìm thấy một lỗi tồn tại từ trước trên một dòng trong một hàm:

std:;string x = y;

Mã này vẫn biên dịch và hoạt động như mong đợi.

Định nghĩa chuỗi hoạt động bởi vì tệp này là using namespace std;, do đó, ngay từ đầu std::là không cần thiết.

Câu hỏi đặt ra là, tại sao lại std:;biên dịch và điều gì, nếu có, nó đang làm gì?


1
@Xeo: Anh ấy đã nói trong câu hỏi mà anh ấy có using namespace std;.
Fred Larson

@Fred: Derp! Phần đó không được đánh dấu là mã, vì vậy tôi chỉ bỏ qua nó. :) Tuy nhiên, tôi vẫn muốn chỉ ra câu hỏi này .
Xéo

23
Cùng lý do đó http://www.stackoverflow.combiên dịch ...
Kerrek SB

19
Tuy nhiên, một lý do khác không sử dụng using namespace std;:)
David Rodríguez - dribeas

@KerrekSB Điều đó đã xảy ra với một người bạn của tôi khi đang duyệt reddit! Các liên kết hóa ra là đây : D
mmirzadeh

Câu trả lời:


90

std:nó là một nhãn, có thể được sử dụng làm mục tiêu goto.

Như được chỉ ra bởi @Adam Rosenfield trong một nhận xét, đó là tên nhãn hợp pháp.

C ++ 03 §6.1 / 1:

Nhãn có không gian tên riêng và không ảnh hưởng đến các định danh khác.


4
Các nhãn AFAIK có không gian tên riêng của chúng, vì vậy chúng không bao giờ xung đột với bất kỳ thứ gì khác, tất nhiên, ngoài từ khóa hoặc macro.
rodrigo

11
C ++ 03 §6.1 / 1 cho biết "Các nhãn có không gian tên riêng và không ảnh hưởng đến các định danh khác."
Adam Rosenfield

6.1 / 1: "Nhãn có không gian tên riêng của họ và không ảnh hưởng đến định danh khác"
John Dibling

32

Đó là một nhãn, theo sau là một câu lệnh trống, tiếp theo là khai báo một chuỗi x.



8
(expression)std: (end of expression); (another expression)string x = y;

4
Về mặt ngữ pháp, nó thực sự là một (label-)statement, không phải expression.
GManNickG

1

Trình biên dịch cho bạn biết điều gì đang xảy ra:

#include <iostream>
using namespace std;
int main() {
  std:;cout << "Hello!" << std::endl;
}

Cả gcc và clang đều đưa ra một cảnh báo khá rõ ràng:

std.cpp:4:3: warning: unused label 'std' [-Wunused-label]
  std:;cout << "Hello!" << std::endl;
  ^~~~
1 warning generated.

Cách rút ra từ câu chuyện này: luôn biên dịch mã của bạn với các cảnh báo được bật (ví dụ -Wall:).

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.