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

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


5
Unicode รองรับได้ดีแค่ไหนใน C ++ 11?
ฉันอ่านแล้วได้ยินว่า C ++ 11 รองรับ Unicode คำถามสองสามข้อเกี่ยวกับเรื่องนี้: ไลบรารีมาตรฐาน C ++ รองรับ Unicode ได้ดีแค่ไหน ไม่std::stringทำในสิ่งที่ควร? ฉันจะใช้มันได้อย่างไร ปัญหาที่อาจเกิดขึ้นอยู่ที่ไหน
183 c++  unicode  c++11 

2
สำนวน safe-bool ล้าสมัยใน C ++ 11 หรือไม่
คำตอบของ @R นี้ Martinho Fernandesแสดงให้เห็นว่าสำนวน safe-bool นั้นถูกคัดค้านอย่างชัดเจนใน C ++ 11 เนื่องจากมันสามารถแทนที่ได้โดยง่าย explicit operator bool() const; ตามคำพูดมาตรฐานในคำตอบ§4 [conv] p3: นิพจน์ e สามารถแปลงเป็นประเภทโดยปริยายTหากการประกาศT t=e;นั้นมีรูปแบบที่ดีสำหรับตัวแปรชั่วคราวที่ประดิษฐ์ขึ้นมาบางส่วนt(§8.5) โครงสร้างภาษาบางภาษาต้องการให้นิพจน์ถูกแปลงเป็นค่าบูลีน การแสดงออกeที่ปรากฏในบริบทดังกล่าวกล่าวคือจะต้องแปลงบริบทการboolและเป็นรูปแบบที่ดีและถ้าหากการประกาศbool t(e);เป็นรูปแบบที่ดีสำหรับบางคนคิดค้นตัวแปรเสื้อชั่วคราว (§8.5) ส่วนที่ไฮไลต์จะแสดงให้เห็นอย่างชัดเจนว่า "การส่งแบบชัดเจนโดยนัย" (เรียกว่า "การแปลงตามบริบท" ในมาตรฐาน) เป็น @R Martinho วางไว้ "การสร้างภาษาบางอย่าง" ที่ต้องการให้ "cast ชัดแจ้งชัดเจน" ดูเหมือนจะดังต่อไปนี้: if, while, for( §6.4 [stmt.select] p4) ตัวดำเนินการเชิงตรรกะแบบไบนารี&&และ||( §5.14 [expr.log.and/or] p1สำหรับทั้งคู่) …


4
เป็นไปได้ไหมที่จะใช้ std :: string ใน constexpr
โดยใช้ C ++ 11, อูบุนตู 14.04, toolchain รหัสนี้ล้มเหลว: constexpr std::string constString = "constString"; ข้อผิดพลาด: ประเภท 'สตริง const {aka const std :: basic_string}' ของตัวแปร constexpr 'constString' ไม่ใช่ตัวอักษร ... เพราะ ... 'std :: basic_string' มี destructor ที่ไม่สำคัญ เป็นไปได้ที่จะใช้std::stringในconstexpr? (เห็นได้ชัดว่าไม่ใช่ ... ) ถ้าเป็นเช่นนั้นได้อย่างไร มีวิธีอื่นในการใช้สตริงอักขระในconstexpr?

3
std :: atomic คืออะไร?
ฉันเข้าใจว่าstd::atomic<>เป็นวัตถุอะตอม แต่ปรมาณูในระดับใด เพื่อความเข้าใจของฉันการดำเนินการสามารถเป็นอะตอม การทำวัตถุอะตอมหมายถึงอะไรกันแน่? ตัวอย่างเช่นถ้ามีสองกระทู้พร้อมกันรันรหัสต่อไปนี้: a = a + 12; ถ้าอย่างนั้นการปฎิบัติการทั้งหมดadd_twelve_to(int)คืออะไร? หรือมีการเปลี่ยนแปลงกับตัวแปรอะตอม (เช่นoperator=())?

2
shared_ptr ไปยังอาร์เรย์: ควรใช้หรือไม่
shared_ptrเพียงแค่การสอบถามเกี่ยวกับการขนาดเล็ก เป็นวิธีปฏิบัติที่ดีที่จะใช้การshared_ptrชี้ไปที่อาร์เรย์หรือไม่ ตัวอย่างเช่น, shared_ptr<int> sp(new int[10]); ถ้าไม่เช่นนั้นทำไมไม่ เหตุผลหนึ่งที่ฉันทำไปแล้วตระหนักถึงความเป็นหนึ่งไม่สามารถเพิ่ม / shared_ptrพร่อง ดังนั้นจึงไม่สามารถใช้งานได้เหมือนตัวชี้ปกติไปยังอาร์เรย์
172 c++  c++11  shared-ptr 

2
ทำไมคอมไพเลอร์สามารถปรับแต่งแลมบ์ดาได้ดีกว่าฟังก์ชั่นธรรมดา?
ในหนังสือของเขาThe C++ Standard Library (Second Edition)Nicolai Josuttis ระบุว่า lambdas สามารถปรับให้เหมาะสมโดยคอมไพเลอร์มากกว่าฟังก์ชั่นธรรมดา นอกจากนี้คอมไพเลอร์ C ++ เพิ่มประสิทธิภาพ lambdas ได้ดีกว่าฟังก์ชั่นทั่วไป (หน้า 213) ทำไมถึงเป็นอย่างนั้น? ฉันคิดว่าเมื่อพูดถึงการอินไลน์ก็ไม่น่าจะมีความแตกต่างอีกต่อไป เหตุผลเดียวที่ฉันคิดได้ก็คือคอมไพเลอร์อาจมีบริบทท้องถิ่นที่ดีขึ้นกับลูกแกะและสิ่งเหล่านี้สามารถทำให้สมมติฐานมากขึ้นและดำเนินการเพิ่มประสิทธิภาพมากขึ้น


5
ฉันจะรับที่อยู่ของวัตถุได้อย่างน่าเชื่อถือเมื่อโอเปอเรเตอร์ & มากเกินไปได้อย่างไร
พิจารณาโปรแกรมต่อไปนี้: struct ghost { // ghosts like to pretend that they don't exist ghost* operator&() const volatile { return 0; } }; int main() { ghost clyde; ghost* clydes_address = &clyde; // darn; that's not clyde's address :'( } ฉันจะได้รับclydeที่อยู่ของได้อย่างไร ฉันกำลังมองหาทางออกที่จะทำงานได้ดีกับวัตถุทุกประเภท โซลูชัน C ++ 03 ก็ดี แต่ฉันก็สนใจ C ++ 11 …

6
C ++ 11, 14, 17 หรือ 20 มีค่าคงที่มาตรฐานสำหรับ pi หรือไม่?
มีปัญหาค่อนข้างโง่กับหมายเลข pi ใน C และ C ++ เท่าที่ฉันรู้M_PIกำหนดไว้math.hไม่จำเป็นต้องมีมาตรฐาน มาตรฐาน C ++ ใหม่แนะนำคณิตศาสตร์ที่ซับซ้อนจำนวนมากในไลบรารีมาตรฐาน - ฟังก์ชันไฮเพอร์โบลิกstd::hermiteและstd::cyl_bessel_iเครื่องกำเนิดเลขสุ่มที่แตกต่างกันเป็นต้น มาตรฐาน 'ใหม่' มีค่าคงที่สำหรับ pi หรือไม่? ถ้าไม่ - ทำไม คณิตศาสตร์ที่ซับซ้อนทั้งหมดนี้ทำงานอย่างไรหากปราศจากมัน? ฉันตระหนักถึงคำถามที่คล้ายกันเกี่ยวกับ pi ใน C ++ (เป็นเวลาหลายปีและมาตรฐานเก่า); ฉันต้องการทราบสถานะปัจจุบันของปัญหา ฉันสนใจด้วยเช่นกันว่าทำไมทำไม C ++ ถึงไม่มีค่าคงที่ pi แต่มีคณิตศาสตร์ที่ซับซ้อนกว่าเยอะ UPD: ฉันรู้ว่าฉันสามารถกำหนด pi ตัวเองเป็น 4 * atan (1) หรือ acos (1) หรือ double pi …

2
ฟังก์ชั่นการแลกเปลี่ยนเพื่อนสาธารณะ
ในคำตอบที่สวยงามของcopy-and-swap-idiomมีโค้ดบางส่วนที่ฉันต้องการความช่วยเหลือเล็กน้อย: class dumb_array { public: // ... friend void swap(dumb_array& first, dumb_array& second) // nothrow { using std::swap; swap(first.mSize, second.mSize); swap(first.mArray, second.mArray); } // ... }; และเขาเพิ่มบันทึก มีการอ้างสิทธิ์อื่น ๆ ที่เราควรชำนาญ std :: swap สำหรับประเภทของเราให้การแลกเปลี่ยนในชั้นเรียนพร้อมการแลกเปลี่ยนฟังก์ชั่นฟรีเป็นต้น แต่สิ่งนี้ไม่จำเป็นทั้งหมด: การใช้ swap ที่เหมาะสมจะต้องผ่านการโทรที่ไม่มีเงื่อนไข และฟังก์ชั่นของเราจะพบผ่าน ADL ฟังก์ชั่นหนึ่งจะทำ เนื่องจากfriendฉันใช้คำศัพท์ที่ "ไม่เป็นมิตร" ฉันต้องยอมรับ ดังนั้นคำถามหลักของฉันคือ: ดูเหมือนว่าฟังก์ชั่นฟรีแต่ภายในร่างกายของคลาส? ไม่ได้เป็นเหตุผลนี้swapคง ? เห็นได้ชัดว่ามันไม่ได้ใช้ตัวแปรสมาชิกใด ๆ …

6
การใช้วัตถุมาตรฐานทั่วไป :: ฟังก์ชั่นที่มีฟังก์ชั่นสมาชิกในชั้นหนึ่ง
สำหรับคลาสหนึ่งฉันต้องการเก็บพอยน์เตอร์ของฟังก์ชั่นบางส่วนไว้ในฟังก์ชั่นสมาชิกของคลาสเดียวกันในวัตถุที่mapเก็บหนึ่งstd::functionอัน แต่ฉันล้มเหลวในตอนแรกด้วยรหัสนี้: class Foo { public: void doSomething() {} void bindFunction() { // ERROR std::function<void(void)> f = &Foo::doSomething; } }; ฉันจะได้รับerror C2064: term does not evaluate to a function taking 0 argumentsในการxxcallobjรวมกับข้อผิดพลาดบาง instantiation แม่แบบแปลก ๆ ขณะนี้ฉันกำลังทำงานกับ Windows 8 ด้วย Visual Studio 2010/2011 และใน Win 7 ด้วย VS10 ก็ล้มเหลวเช่นกัน ข้อผิดพลาดจะต้องขึ้นอยู่กับกฎ C …

3
“ = ค่าเริ่มต้น” แตกต่างจาก“ {}” สำหรับตัวสร้างและตัวทำลายเริ่มต้นอย่างไร
ฉันโพสต์สิ่งนี้เป็นคำถามเกี่ยวกับ destructors เท่านั้น แต่ตอนนี้ฉันเพิ่มการพิจารณาตัวสร้างเริ่มต้น นี่คือคำถามเดิม: ถ้าฉันต้องการให้ destructor ในชั้นเรียนของฉันเป็นเสมือน แต่อย่างอื่นเหมือนกับสิ่งที่คอมไพเลอร์จะสร้างฉันสามารถใช้=default: class Widget { public: virtual ~Widget() = default; }; แต่ดูเหมือนว่าฉันจะได้รับผลกระทบเดียวกันโดยพิมพ์น้อยลงโดยใช้คำจำกัดความที่ว่างเปล่า: class Widget { public: virtual ~Widget() {} }; มีวิธีใดบ้างที่คำจำกัดความทั้งสองนี้ทำงานต่างกัน? จากการตอบกลับที่โพสต์สำหรับคำถามนี้สถานการณ์ของ Constructor เริ่มต้นจะคล้ายกัน ระบุว่าไม่มีความแตกต่างในความหมายระหว่าง " =default" และ " {}" สำหรับ destructors มีความคล้ายคลึงกันเกือบไม่แตกต่างกันในความหมายระหว่างตัวเลือกเหล่านี้สำหรับตัวสร้างเริ่มต้นหรือไม่ นั่นคือสมมติว่าฉันต้องการสร้างประเภทที่วัตถุประเภทนั้นจะถูกสร้างขึ้นและถูกทำลายทำไมฉันอยากจะพูด Widget() = default; แทน Widget() {} ? ฉันขออภัยหากการขยายคำถามนี้หลังจากการโพสต์ต้นฉบับละเมิดกฎ SO …


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