2010-09-11 28 views
7

Visual C++ 2010 chấp nhận:Có phải "dành cho mỗi" Microsoft cụ thể không?

std::vector<int> v; 
v.push_back(1); 
v.push_back(2); 
v.push_back(3); 
for each (auto i in v) 
    std::cout << i << std::endl; 

Đây có phải là một tính năng C++ 11 hoặc một phần mở rộng của Microsoft? Theo Wikipedia, cú pháp của C++ của 11 for-each vòng lặp khác nhau:

int myint[] = {1,2,3,4,5}; 
for (int& i: myint) 
{ 
    std::cout << i; 
} 
+3

bản sao có thể có của [Visual C++ "cho mỗi" tính di động] (http://stackoverflow.com/questions/197375/visual-c-for-each-portability) – kennytm

Trả lời

16

Dự thảo tiêu chuẩn hiện hành không bao gồm cú pháp for each (auto i in v), chỉ có for (auto i : myints), vì vậy có, nó chỉ là một phần mở rộng.

3

Bên cạnh các phiên bản cho các vòng trình bày ở trên một phiên bản conformal tiêu chuẩn C++ 0x cũng sẽ là:

std::for_each (v.begin(), v.end(), [] (int)->void { 
    std::cout << i << std::endl; 
}); 

Các cấu trúc bạn đã trình bày, cũng là conformal tiêu chuẩn, nhưng nó phù hợp với tiêu chuẩn khác nhau: Các Đặc tả ECMA C++/CLI.

+1

Nếu như anh ấy nói, nó biên dịch thành mã nguồn gốc, nó sẽ không được C + + thay vì C + +/Cli? Hay anh ta sai? Hoặc là tôi sai? –

+5

Về mặt kỹ thuật, "C++ 0x standard" là một oxymoron. Nó không phải là một tiêu chuẩn được nêu ra. (Và khi nó trở thành một, nó sẽ không còn được gọi là C++ 0x);) – jalf

+0

@jalf Vâng, vì chúng ta chưa có tên tốt hơn cho nó, tôi nghĩ rằng cái đó là tốt nhất có sẵn ... @ Johannes No, điều này luôn luôn biên dịch sang IL, hoặc với hỗn hợp bí ẩn của IL và mã gốc. Cú pháp này chỉ có thể hoạt động, nếu bạn biên dịch với hỗ trợ CLR (/ tùy chọn clr). –

4

Trong VS2010, nếu có bất kỳ nghi ngờ nào như vậy, hãy thử cờ /Za dưới "C/C++->Language" trong cài đặt dự án IDE.

Đối với truy vấn của bạn, có, đây không phải là cú pháp C++ chuẩn.

+0

Thật vậy, với/Za tôi nhận được lỗi trình biên dịch tại vòng lặp – George

3

Tôi cũng muốn lưu ý một báo trước về vòng lặp "cho mỗi" của Microsoft; bằng cách sử dụng các container STL như std :: vector, bạn không thể chuyển các biến theo tham chiếu, chỉ bằng giá trị và tham chiếu const. Ví dụ:

int myarr [] = {4, 6, 8, 10, 12, 15}; 
std::vector<int> mvt (myarr, myarr+6); 

for each (int & x in mvt) //will not compile for reasons unbeknownst to those outside MS 
    x+= 4; 

Nếu trình biên dịch của bạn hỗ trợ dựa trên phạm vi C++ 0x để tôi sử dụng thay thế. Nếu không, tôi sẽ sử dụng BOOST_FOREACH hoặc std :: for_each với một đối tượng hàm hoặc lambda vì chúng là di động. Dù bạn làm gì, hãy giữ rõ ràng "Microsoft cho mỗi" của Microsoft.

+0

bằng cách sử dụng ' cho mỗi công cụ (const int & x in mvt) 'hoạt động và bạn có thể sử dụng' const_cast' để làm cho mục có thể chỉnh sửa được – dmjalund

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