คำถามติดแท็ก c++11

ใช้แท็กนี้สำหรับรหัสที่ต้องคอมไพล์เป็น C ++ 11 (ไม่ใช้ฟีเจอร์ที่แนะนำใน C ++ 14 หรือใหม่กว่า)

6
เหตุใด std :: initializer_list จึงไม่เป็นภาษาในตัว
เหตุใดจึงไม่มีstd::initializer_listภาษาหลักในตัว สำหรับฉันแล้วดูเหมือนว่ามันเป็นคุณสมบัติที่สำคัญของ C ++ 11 แต่ก็ไม่มีคำหลักที่สงวนไว้ (หรือบางอย่างที่เหมือนกัน) แต่initializer_listเป็นเพียงคลาสเทมเพลตจากไลบรารีมาตรฐานที่มีการแมปพิเศษโดยนัยจากไวยากรณ์รายการวงเล็บปีกกา ใหม่{...}ที่คอมไพเลอร์จัดการ ตอนแรกคิดว่าโซลูชันนี้ค่อนข้างแฮ็ค นี่เป็นวิธีการใช้งานส่วนเพิ่มเติมใหม่ในภาษา C ++: โดยบทบาทโดยปริยายของคลาสเทมเพลตบางคลาสไม่ใช่ภาษาหลักหรือไม่? โปรดพิจารณาตัวอย่างเหล่านี้: widget<int> w = {1,2,3}; //this is how we want to use a class เหตุใดจึงเลือกคลาสใหม่: widget( std::initializer_list<T> init ) แทนที่จะใช้สิ่งที่คล้ายกับแนวคิดเหล่านี้: widget( T[] init, int length ) // (1) widget( T... init ) // (2) widget( std::vector<T> …

3
เมื่อใดควรใช้ตัวเริ่มต้นที่ปิดด้วยปีกกา
ใน C ++ 11 เรามีไวยากรณ์ใหม่สำหรับการเริ่มต้นคลาสซึ่งทำให้เรามีความเป็นไปได้มากมายในการเริ่มต้นตัวแปร { // Example 1 int b(1); int a{1}; int c = 1; int d = {1}; } { // Example 2 std::complex<double> b(3,4); std::complex<double> a{3,4}; std::complex<double> c = {3,4}; auto d = std::complex<double>(3,4); auto e = std::complex<double>{3,4}; } { // Example 3 std::string a(3,'x'); std::string …

2
การใช้งานแลมด้า C ++ 11 และโมเดลหน่วยความจำ
ฉันต้องการข้อมูลเกี่ยวกับวิธีการคิดอย่างถูกต้องเกี่ยวกับการปิด C ++ 11 และstd::functionในแง่ของวิธีการใช้งานและวิธีจัดการหน่วยความจำ แม้ว่าฉันจะไม่เชื่อในการเพิ่มประสิทธิภาพก่อนกำหนด แต่ฉันก็มีนิสัยในการพิจารณาผลกระทบด้านประสิทธิภาพของตัวเลือกของฉันอย่างรอบคอบในขณะที่เขียนโค้ดใหม่ ฉันยังเขียนโปรแกรมแบบเรียลไทม์ในปริมาณพอสมควรเช่นในไมโครคอนโทรลเลอร์และสำหรับระบบเสียงซึ่งต้องหลีกเลี่ยงการจัดสรรหน่วยความจำแบบไม่กำหนด / การหยุดการจัดสรร ดังนั้นฉันจึงต้องการพัฒนาความเข้าใจให้ดีขึ้นว่าเมื่อใดควรใช้หรือไม่ใช้ C ++ lambdas ความเข้าใจปัจจุบันของฉันคือแลมด้าที่ไม่มีการปิดจับนั้นเหมือนกับการเรียกกลับ C อย่างไรก็ตามเมื่อสภาพแวดล้อมถูกจับด้วยค่าหรือโดยการอ้างอิงอ็อบเจ็กต์ที่ไม่ระบุชื่อจะถูกสร้างขึ้นบนสแต็ก std::functionเมื่อมูลค่าปิดต้องถูกส่งกลับจากฟังก์ชั่นหนึ่งใน wraps จะเกิดอะไรขึ้นกับหน่วยความจำการปิดในกรณีนี้? คัดลอกจากสแต็กไปยังฮีปหรือไม่ เป็นอิสระเมื่อใดก็ตามที่std::functionเป็นอิสระกล่าวคือมีการนับการอ้างอิงเหมือน a std::shared_ptrหรือไม่? ฉันคิดว่าในระบบเวลาจริงฉันสามารถตั้งค่าฟังก์ชั่นห่วงโซ่ของแลมบ์ดาผ่าน B เป็นอาร์กิวเมนต์ต่อเนื่องไปเพื่อให้ท่อการประมวลผลA->Bจะถูกสร้างขึ้น ในกรณีนี้การปิด A และ B จะถูกจัดสรรครั้งเดียว แม้ว่าฉันไม่แน่ใจว่าสิ่งเหล่านี้จะถูกจัดสรรบนสแต็กหรือฮีป อย่างไรก็ตามโดยทั่วไปดูเหมือนว่าปลอดภัยที่จะใช้ในระบบเรียลไทม์ ในทางกลับกันถ้า B สร้างฟังก์ชันแลมบ์ดาบางฟังก์ชัน C ซึ่งส่งคืนหน่วยความจำสำหรับ C จะได้รับการจัดสรรและจัดสรรซ้ำ ๆ ซึ่งจะไม่เป็นที่ยอมรับสำหรับการใช้งานแบบเรียลไทม์ ในรหัสหลอกคือ DSP loop ซึ่งฉันคิดว่าจะปลอดภัยแบบเรียลไทม์ ฉันต้องการประมวลผลบล็อก A และ …
97 c++  memory  lambda  c++11 

7
ฉันจะส่ง std :: unique_ptr ไปยังฟังก์ชันได้อย่างไร
ฉันจะส่งผ่านstd::unique_ptrเข้าสู่ฟังก์ชันได้อย่างไร? บอกว่าฉันมีคลาสต่อไปนี้: class A { public: A(int val) { _val = val; } int GetVal() { return _val; } private: int _val; }; ต่อไปนี้ไม่ได้รวบรวม: void MyFunc(unique_ptr<A> arg) { cout << arg->GetVal() << endl; } int main(int argc, char* argv[]) { unique_ptr<A> ptr = unique_ptr<A>(new A(1234)); MyFunc(ptr); return 0; } เหตุใดฉันจึงไม่สามารถส่งผ่านstd::unique_ptrเข้าสู่ฟังก์ชันได้ …
97 c++  c++11  unique-ptr 

3
อะไรคือความแตกต่างระหว่างแนวคิดและข้อ จำกัด ของเทมเพลต
ฉันต้องการทราบว่าอะไรคือความแตกต่างทางความหมายระหว่างข้อเสนอแนวคิดเต็มรูปแบบ C ++ และข้อ จำกัด ของเทมเพลต (ตัวอย่างเช่นข้อ จำกัด ที่ปรากฏใน Dlang หรือ ข้อเสนอแนวคิดใหม่สำหรับ C ++ 1y ) แนวคิดที่สมบูรณ์สามารถทำอะไรได้มากกว่าข้อ จำกัด ของเทมเพลตที่ไม่สามารถทำได้
96 c++  c++11  d  c++-concepts 

3
ทำไมไม่มี std :: stou?
C ++ 11 เพิ่มฟังก์ชันการแปลงสตริงใหม่: http://en.cppreference.com/w/cpp/string/basic_string/stoul ซึ่งรวมถึง stoi (string to int), stol (string to long), stoll (string to long long), stoul (string to unsigned long), stoull (string to unsigned long long) สิ่งที่โดดเด่นในกรณีที่ไม่มีคือฟังก์ชัน stou (string to unsigned) มีเหตุผลบางอย่างที่ไม่จำเป็น แต่เหตุผลอื่น ๆ ทั้งหมดคืออะไร? เกี่ยวข้อง: ไม่มีฟังก์ชัน "sto {short, unsigned short}" ใน C ++ 11?
96 c++  string  c++11  std 

8
เหตุใดมาโครตัวประมวลผลล่วงหน้าจึงชั่วร้ายและทางเลือกอื่นคืออะไร?
ฉันถามเรื่องนี้มาตลอด แต่ไม่เคยได้รับคำตอบที่ดีเลย ฉันคิดว่าโปรแกรมเมอร์เกือบทุกคนก่อนที่จะเขียน "Hello World" คนแรกเคยพบวลีเช่น "มาโครไม่ควรใช้", "มาโครเป็นสิ่งชั่วร้าย" และอื่น ๆ คำถามของฉันคือ: ทำไม? ด้วย C ++ 11 ใหม่มีทางเลือกใหม่หลังจากผ่านไปหลายปีหรือไม่? ส่วนที่ง่ายคือเกี่ยวกับมาโครเช่น#pragmaซึ่งเป็นแพลตฟอร์มเฉพาะและคอมไพเลอร์เฉพาะและส่วนใหญ่มักมีข้อบกพร่องร้ายแรงเช่น#pragma onceนี้เกิดข้อผิดพลาดได้ง่ายในสถานการณ์สำคัญอย่างน้อย 2 สถานการณ์: ชื่อเดียวกันในเส้นทางที่แตกต่างกันและด้วยการตั้งค่าเครือข่ายและระบบไฟล์บางอย่าง แต่โดยทั่วไปแล้วมาโครและทางเลือกอื่น ๆ ในการใช้งานล่ะ?


1
การแก้ปัญหาโอเวอร์โหลดที่คลุมเครือบนตัวชี้ฟังก์ชันและฟังก์ชัน std :: สำหรับแลมบ์ดาโดยใช้ +
ในรหัสต่อไปนี้การเรียกครั้งแรกถึงfooไม่ชัดเจนดังนั้นจึงไม่สามารถรวบรวมได้ ประการที่สองด้วยการเพิ่ม+ก่อนแลมบ์ดาจะแก้ไขการโอเวอร์โหลดของตัวชี้ฟังก์ชัน #include <functional> void foo(std::function<void()> f) { f(); } void foo(void (*f)()) { f(); } int main () { foo( [](){} ); // ambiguous foo( +[](){} ); // not ambiguous (calls the function pointer overload) } อะไรคือสิ่งที่+สัญกรณ์ทำอะไรที่นี่?

2
[=] หมายความว่าอย่างไรใน C ++
ฉันอยากรู้ว่าอะไร[=]? นี่คือตัวอย่างสั้น ๆ template <typename T> std::function<T (T)> makeConverter(T factor, T offset) { return [=] (T input) -> T { return (offset + input) * factor; }; } auto milesToKm = makeConverter(1.60936, 0.0); รหัสจะทำงานร่วมกับ[]แทนที่จะเป็น[=]อย่างไร ฉันคิดว่า std::function<T (T)> หมายถึงต้นแบบฟังก์ชันที่ได้รับ(T)เป็นอาร์กิวเมนต์และประเภทการส่งคืนT?
95 c++  c++11  lambda 

6
ความยาวการคำนวณของสตริง C ในเวลาคอมไพล์ นี่คือ constexpr จริงๆหรือ?
ฉันกำลังพยายามคำนวณความยาวของสตริงลิเทอรัลในเวลาคอมไพล์ ในการทำเช่นนั้นฉันใช้รหัสต่อไปนี้: #include <cstdio> int constexpr length(const char* str) { return *str ? 1 + length(str + 1) : 0; } int main() { printf("%d %d", length("abcd"), length("abcdefgh")); } ทุกอย่างทำงานตามที่คาดไว้โปรแกรมจะพิมพ์ 4 และ 8 รหัสแอสเซมบลีที่สร้างขึ้นโดยเสียงดังแสดงว่าผลลัพธ์ถูกคำนวณในเวลาคอมไพล์: 0x100000f5e: leaq 0x35(%rip), %rdi ; "%d %d" 0x100000f65: movl $0x4, %esi 0x100000f6a: movl $0x8, %edx 0x100000f6f: …

8
แลมด้า C ++ พร้อมแคปเจอร์เป็นตัวชี้ฟังก์ชัน
ฉันกำลังเล่นกับ C ++ lambdas และการแปลงโดยนัยเป็นฟังก์ชันพอยน์เตอร์ ตัวอย่างเริ่มต้นของฉันใช้เป็นคำเรียกกลับสำหรับฟังก์ชัน ftw สิ่งนี้ได้ผลตามที่คาดไว้ #include <ftw.h> #include <iostream> using namespace std; int main() { auto callback = [](const char *fpath, const struct stat *sb, int typeflag) -> int { cout << fpath << endl; return 0; }; int ret = ftw("/etc", callback, 1); return ret; } …

4
จะรับระยะเวลาเป็น int มิลลิวินาทีและลอยวินาทีจาก <chrono> ได้อย่างไร
ฉันพยายามใช้ chrono library สำหรับตัวจับเวลาและระยะเวลา ฉันต้องการที่จะมีDuration frameStart;(ตั้งแต่เริ่มต้นแอป) และDuration frameDelta;(เวลาระหว่างเฟรม) ฉันต้องสามารถรับframeDeltaระยะเวลาเป็นมิลลิวินาทีและวินาทีลอยได้ คุณทำสิ่งนี้กับ&lt;chrono&gt;ไลบรารีc ++ 11 ใหม่ได้อย่างไร ฉันทำงานกับมันและ googling (ข้อมูลกระจัดกระจาย) โค้ดได้รับการเทมเพลนอย่างมากและต้องใช้การร่ายและสิ่งต่างๆเป็นพิเศษฉันไม่สามารถหาวิธีใช้ไลบรารีนี้ได้อย่างถูกต้อง
94 c++  c++11  timer  chrono 

6
C ++ ยุติการเรียกโดยไม่มีข้อยกเว้นที่ใช้งานอยู่
ฉันได้รับข้อผิดพลาด C ++ กับเธรด: terminate called without an active exception Aborted นี่คือรหัส: #include &lt;queue&gt; #include &lt;thread&gt; #include &lt;mutex&gt; #include &lt;condition_variable&gt; template&lt;typename TYPE&gt; class blocking_stream { public: blocking_stream(size_t max_buffer_size_) : max_buffer_size(max_buffer_size_) { } //PUSH data into the buffer blocking_stream &amp;operator&lt;&lt;(TYPE &amp;other) { std::unique_lock&lt;std::mutex&gt; mtx_lock(mtx); while(buffer.size()&gt;=max_buffer_size) stop_if_full.wait(mtx_lock); buffer.push(std::move(other)); mtx_lock.unlock(); stop_if_empty.notify_one(); return *this; …

3
Explicit Return Type ของ Lambda
เมื่อฉันพยายามรวบรวมรหัสนี้ (VS2010) ฉันได้รับข้อผิดพลาดต่อไปนี้: error C3499: a lambda that has been specified to have a void return type cannot return a value void DataFile::removeComments() { string::const_iterator start, end; boost::regex expression("^\\s?#"); boost::match_results&lt;std::string::const_iterator&gt; what; boost::match_flag_type flags = boost::match_default; // Look for lines that either start with a hash (#) // or have nothing …

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