คำถามติดแท็ก auto

คำหลัก "อัตโนมัติ" ถูกนำมาใช้ใหม่ใน C ++ 11 สำหรับประเภทที่อนุมาน เมื่อใช้เพื่อแทนที่ชื่อชนิดในการประกาศตัวแปรเริ่มต้นตัวแปรจะได้รับประเภทเดียวกับตัวเริ่มต้น เมื่อใช้เป็นชนิดการส่งคืนประเภทการส่งคืนจะถูกระบุเป็นชนิดผลตอบแทนต่อท้ายหรืออนุมานจากนิพจน์ที่ส่งคืน

4
การใช้ 'อัตโนมัติ' ของ C ++ 11 สามารถปรับปรุงประสิทธิภาพได้หรือไม่
ฉันเห็นได้ว่าทำไมautoประเภทใน C ++ 11 ช่วยปรับปรุงความถูกต้องและการบำรุงรักษา ฉันอ่านแล้วว่ามันยังสามารถปรับปรุงประสิทธิภาพได้ ( เกือบจะอัตโนมัติทุกครั้งโดย Herb Sutter) แต่ฉันพลาดคำอธิบายที่ดี จะautoปรับปรุงประสิทธิภาพได้อย่างไร ใครสามารถยกตัวอย่างได้บ้าง
230 c++  performance  c++11  auto 

14
คำหลักอัตโนมัติ C ++ 11 มีมากเกินไป
ฉันใช้autoคำหลักใหม่ที่มีอยู่ในมาตรฐาน C ++ 11 สำหรับประเภท templated ที่ซับซ้อนซึ่งเป็นสิ่งที่ฉันเชื่อว่าได้รับการออกแบบมา แต่ฉันก็ใช้มันเพื่อสิ่งต่าง ๆ เช่น: auto foo = std::make_shared<Foo>(); และน่าสงสัยมากขึ้นสำหรับ: auto foo = bla(); // where bla() return a shared_ptr<Foo> ฉันไม่เห็นการสนทนาในหัวข้อนี้มากนัก ดูเหมือนว่าautoจะใช้มากเกินไปเนื่องจากประเภทหนึ่งมักเป็นรูปแบบของเอกสารและการตรวจสอบสติ คุณวาดเส้นในการใช้ที่ไหนautoและกรณีการใช้งานที่แนะนำสำหรับคุณลักษณะใหม่นี้คืออะไร เพื่อชี้แจง: ฉันไม่ได้ขอความคิดเห็นทางปรัชญา; ฉันขอใช้คำหลักนี้อย่างตั้งใจโดยคณะกรรมการมาตรฐานอาจมีความคิดเห็นเกี่ยวกับวิธีการใช้งานที่ตั้งใจนั้นได้รับรู้ในทางปฏิบัติ หมายเหตุด้านข้าง: คำถามนี้ถูกย้ายไปที่ SE.Programmers แล้วกลับไปที่ Stack Overflow การสนทนาเกี่ยวกับเรื่องนี้สามารถพบได้ในคำถามเมตานี้

4
auto && บอกอะไรเรา
ถ้าคุณอ่านรหัสเช่น auto&& var = foo(); ซึ่งfooเป็นฟังก์ชั่นใด ๆ Tกลับมาจากค่าของชนิด จากนั้นvarเป็น lvalue อ้างอิงประเภท rvalue Tไป แต่สิ่งนี้บ่งบอกถึงvarอะไร? หมายความว่าเราได้รับอนุญาตให้ขโมยทรัพยากรของvarหรือไม่ มีสถานการณ์ที่เหมาะสมเมื่อคุณควรใช้auto&&เพื่อบอกผู้อ่านโค้ดของคุณว่าคุณทำอย่างไรเมื่อคุณกลับมาunique_ptr<>เพื่อบอกว่าคุณมีความเป็นเจ้าของโดยเฉพาะ? และตัวอย่างเช่นT&&เมื่อTเป็นประเภทชั้นเรียน? ฉันแค่ต้องการที่จะเข้าใจหากมีกรณีการใช้งานอื่น ๆ ที่auto&&นอกเหนือจากในการเขียนโปรแกรมแม่แบบ; เหมือนที่กล่าวไว้ในตัวอย่างในบทความนี้Universal Referencesโดย Scott Meyers

2
เดคไทป์ (อัตโนมัติ) มีประโยชน์อะไรบ้าง?
Наэтотвопросестьответына Stack Overflow нарусском : Конструкция decltype (อัตโนมัติ) ใน c ++ 14 มีการใช้decltype(auto)สำนวน โดยปกติการใช้งานของมันคือการอนุญาตให้มีautoการประกาศใช้decltypeกฎระเบียบเกี่ยวกับการแสดงออกที่กำหนด ค้นหาตัวอย่างของการใช้คำว่า "ดี" ของสำนวนฉันสามารถนึกถึงสิ่งต่าง ๆ ดังต่อไปนี้ (โดยสก็อตต์เมเยอร์ส ) นั่นคือสำหรับการคืนค่าประเภทของฟังก์ชัน : template<typename ContainerType, typename IndexType> // C++14 decltype(auto) grab(ContainerType&& container, IndexType&& index) { authenticateUser(); return std::forward<ContainerType>(container)[std::forward<IndexType>(index)]; } มีตัวอย่างอื่น ๆ ที่คุณสมบัติภาษาใหม่นี้มีประโยชน์หรือไม่

7
คำหลักอัตโนมัติ C ++ ทำไมมันมหัศจรรย์?
จากวัสดุทั้งหมดที่ฉันใช้ในการเรียนรู้ C ++ autoเป็นตัวระบุระยะเวลาเก็บข้อมูลแปลก ๆ ที่ไม่ได้มีจุดประสงค์เสมอ แต่เมื่อเร็ว ๆ นี้ฉันพบรหัสที่ใช้มันเป็นชื่อประเภทในและของตัวเอง ฉันลองมันด้วยความอยากรู้และมันจะเป็นประเภทของสิ่งที่ฉันจะกำหนดให้มัน! ทันใดนั้นตัววนซ้ำ STL และอะไรก็ได้ที่ใช้แม่แบบนั้นเขียนได้ง่ายกว่า 10 เท่า รู้สึกเหมือนฉันกำลังใช้ภาษา 'สนุก' เช่น Python คำหลักนี้อยู่ที่ไหนทั้งชีวิตของฉัน คุณจะรีบฝันของฉันโดยบอกว่ามันเป็นเอกสิทธิ์ของสตูดิโอภาพหรือไม่พกพา?
145 c++  types  c++11  auto 

14
มีข้อเสียในการประกาศตัวแปรที่มี auto ใน C ++ หรือไม่
ดูเหมือนว่าautoเป็นคุณสมบัติที่มีความสำคัญพอสมควรที่จะเพิ่มใน C ++ 11 ที่ดูเหมือนว่าจะเป็นไปตามภาษาที่ใหม่กว่ามากมาย เช่นเดียวกับภาษาอย่าง Python ฉันไม่เคยเห็นการประกาศตัวแปรที่ชัดเจน (ฉันไม่แน่ใจว่ามันเป็นไปได้โดยใช้มาตรฐาน Python หรือไม่) มีข้อเสียเปรียบในการใช้autoประกาศตัวแปรแทนที่จะประกาศอย่างชัดเจนหรือไม่?

6
แลมบ์ดาชนิดใดเมื่ออนุมานด้วย“ auto” ใน C ++ 11
ฉันเข้าใจว่าแลมบ์ดาเป็นตัวชี้ฟังก์ชั่น เมื่อฉันทำการทดสอบต่อไปนี้ฉันพบว่ามันผิด ( สาธิต ) #define LAMBDA [] (int i) -> long { return 0; } int main () { long (*pFptr)(int) = LAMBDA; // ok auto pAuto = LAMBDA; // ok assert(typeid(pFptr) == typeid(pAuto)); // assertion fails ! } รหัสข้างต้นหายไปจุดใด? ถ้าไม่เช่นtypeofนั้นแลมบ์ดานิพจน์คืออะไรเมื่ออนุมานด้วยautoคำหลัก?
142 c++  lambda  c++11  typeof  auto 

4
เหตุใดฉันจึงใช้รถยนต์เป็นประเภทส่วนตัว
ฉันรู้สึกประหลาดใจอย่างยิ่งที่โค้ดต่อไปนี้รวบรวมและทำงาน (vc2012 & gcc4.7.2) class Foo { struct Bar { int i; }; public: Bar Baz() { return Bar(); } }; int main() { Foo f; // Foo::Bar b = f.Baz(); // error auto b = f.Baz(); // ok std::cout << b.i; } ถูกต้องหรือไม่ว่ารหัสนี้รวบรวมได้ดี และทำไมมันถูกต้อง? เหตุใดฉันสามารถใช้autoกับประเภทส่วนตัวในขณะที่ฉันไม่สามารถใช้ชื่อได้ (ตามที่คาดไว้)

2
ตัวดำเนินการลูกศร (->) ในส่วนหัวของฟังก์ชัน
ฉันเจอรหัสต่อไปนี้: template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) { return a+b; } มีสิ่งหนึ่งที่ฉันไม่เข้าใจ: ฉันจะทราบได้อย่างไรว่าตัวดำเนินการลูกศร ( ->) หมายถึงอะไรในส่วนหัวของฟังก์ชัน ฉันเดาด้วยเหตุผลล้วนๆว่า->โอเปอเรเตอร์กำหนดประเภทซึ่งautoจะอนุมานได้ แต่ฉันต้องการตรงนี้ ฉันไม่พบข้อมูลใด ๆ
129 c++  c++11  auto  decltype 

7
ทำไม auto a = 1; รวบรวมใน C?
รหัส: int main(void) { auto a=1; return 0; } รวบรวมโดยไม่มีข้อผิดพลาดโดยคอมไพเลอร์ MS Visual Studio 2012 เมื่อไฟล์มีนามสกุล. c ฉันคิดมาตลอดว่าเมื่อคุณใช้นามสกุล. c การคอมไพล์ควรเป็นไปตามไวยากรณ์ C ไม่ใช่ C ++ ยิ่งไปกว่านั้นเท่าที่ฉันรู้ว่าอัตโนมัติที่ไม่มีประเภทนั้นอนุญาตให้ใช้เฉพาะใน C ++ ตั้งแต่ C ++ 11 ซึ่งหมายความว่าประเภทนั้นอนุมานจากตัวเริ่มต้น นั่นหมายความว่าคอมไพเลอร์ของฉันไม่ยึดติดกับ C หรือรหัสถูกต้องในภาษาซีจริงหรือไม่?
125 c  auto  c11 

6
แลมด้ากลับมาเอง: ถูกกฎหมายหรือไม่?
พิจารณาโปรแกรมที่ไร้ประโยชน์นี้: #include <iostream> int main(int argc, char* argv[]) { int a = 5; auto it = [&](auto self) { return [&](auto b) { std::cout << (a + b) << std::endl; return self(self); }; }; it(it)(4)(6)(42)(77)(999); } โดยพื้นฐานแล้วเราพยายามสร้างแลมด้าที่คืนค่าตัวเอง MSVC รวบรวมโปรแกรมและทำงาน gcc รวบรวมโปรแกรมและ segfaults เสียงดังปฏิเสธโปรแกรมด้วยข้อความ: error: function 'operator()<(lambda at lam.cpp:6:13)>' with deduced …

3
แลมด้าทั่วไปทำงานอย่างไรใน C ++ 14
แลมบ์ดาทั่วไปทำงานอย่างไร ( autoคีย์เวิร์ดเป็นประเภทอาร์กิวเมนต์) ในมาตรฐาน C ++ 14 มันขึ้นอยู่กับแม่แบบ C ++ ที่คอมไพเลอร์ประเภทอาร์กิวเมนต์แต่ละตัวสร้างฟังก์ชันใหม่ที่มีเนื้อความเดียวกัน แต่แทนที่ประเภท (ความหลากหลายของเวลาคอมไพล์) หรือคล้ายกับชื่อสามัญของ Java (การลบประเภท) มากกว่าหรือไม่? ตัวอย่างโค้ด: auto glambda = [](auto a) { return a; };
114 c++  lambda  auto  c++14 

6
มีการอนุมานประเภทอัตโนมัติใน Java หรือไม่?
มีautoประเภทตัวแปรใน Java เช่นเดียวกับที่คุณมีใน C ++ หรือไม่? ตัวอย่าง: for ( auto var : object_array) std::cout << var << std::endl; for( auto var : object_array) var.do_something_that_only_this_particular_obj_can_do(); ฉันรู้ว่ามีการปรับปรุงสำหรับลูปใน Java แต่มีอัตโนมัติหรือไม่ ถ้าไม่มีการแฮ็กเพื่อทำสิ่งนี้หรือไม่? ฉันกำลังอ้างถึงคุณสมบัติใหม่ใน C ++ 11
113 java  c++  auto 

4
รูปแบบไวยากรณ์ชนิดการส่งคืนต่อท้ายควรเป็นค่าเริ่มต้นสำหรับโปรแกรม C ++ 11 ใหม่หรือไม่ [ปิด]
ปิด . คำถามนี้เป็นคำถามความคิดเห็นตาม ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบได้ด้วยข้อเท็จจริงและการอ้างอิงโดยแก้ไขโพสต์นี้ ปิดให้บริการใน3 ปีที่ผ่านมา ปรับปรุงคำถามนี้ C ++ 11 รองรับไวยากรณ์ของฟังก์ชันใหม่: auto func_name(int x, int y) -> int; ปัจจุบันฟังก์ชันนี้จะประกาศเป็น: int func_name(int x, int y); รูปแบบใหม่ดูเหมือนจะยังไม่ได้รับการยอมรับอย่างกว้างขวาง (พูดใน gcc stl) อย่างไรก็ตามควรใช้สไตล์ใหม่นี้ทุกที่ในโปรแกรม C ++ 11 ใหม่หรือจะใช้เมื่อจำเป็นเท่านั้น? โดยส่วนตัวแล้วฉันชอบรูปแบบเก่าเมื่อเป็นไปได้ แต่ฐานรหัสที่มีรูปแบบผสมดูค่อนข้างน่าเกลียด

4
C ++ auto & vs auto
เมื่อสร้างตัวแปรท้องถิ่นใช้ถูกต้อง(const) auto&หรือautoไม่? เช่น: SomeClass object; const auto result = object.SomeMethod(); หรือ const auto& result = object.SomeMethod(); โดยที่ SomeMethod () ส่งคืนค่าที่ไม่ใช่พื้นฐาน - อาจเป็นประเภทอื่นที่ผู้ใช้กำหนดเอง ความเข้าใจของฉันconst auto& resultถูกต้องเนื่องจากผลลัพธ์ที่ SomeMethod () ส่งคืนจะเรียกตัวสร้างการคัดลอกสำหรับชนิดที่ส่งคืน กรุณาแก้ไขฉันถ้าฉันผิด สิ่งที่เกี่ยวกับประเภทดั้งเดิม? ฉันถือว่าconst auto sum = 1 + 2;ถูกต้อง สิ่งนี้ใช้กับช่วงที่อิงกับลูปด้วยหรือไม่ for(const auto& object : objects)
91 c++  auto 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.