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

C ++ เป็นภาษาโปรแกรมทั่วไป เดิมได้รับการออกแบบให้เป็นส่วนขยายของ C และมีไวยากรณ์ที่คล้ายกัน แต่ตอนนี้มันเป็นภาษาที่แตกต่างอย่างสิ้นเชิง ใช้แท็กนี้สำหรับคำถามเกี่ยวกับรหัส (จะ) คอมไพล์ด้วยคอมไพเลอร์ C ++ ใช้แท็กเฉพาะรุ่นสำหรับคำถามที่เกี่ยวข้องกับการแก้ไขมาตรฐานเฉพาะ [C ++ 11], [C ++ 14], [C ++ 17] หรือ [C ++ 20] เป็นต้น

5
วิธีแก้ปัญหาการอ้างอิง const ที่ค้าง
โปรแกรมย่อต่อไปนี้ #include <vector> #include <iostream> std::vector<int> someNums() { return {3, 5, 7, 11}; } class Woop { public: Woop(const std::vector<int>& nums) : numbers(nums) {} void report() { for (int i : numbers) std::cout << i << ' '; std::cout << '\n'; } private: const std::vector<int>& numbers; }; int main() { …
18 c++ 

3
ค่าปิดของแลมบ์ดาสามารถส่งผ่านเป็นพารามิเตอร์อ้างอิง rvalue ได้
ฉันพบว่าการlvalueปิดแลมบ์ดาสามารถส่งผ่านเป็นrvalueพารามิเตอร์ฟังก์ชันได้เสมอ ดูการสาธิตง่ายๆดังต่อไปนี้ #include <iostream> #include <functional> using namespace std; void foo(std::function<void()>&& t) { } int main() { // Case 1: passing a `lvalue` closure auto fn1 = []{}; foo(fn1); // works // Case 2: passing a `lvalue` function object std::function<void()> fn2 = []{}; foo(fn2); // compile error return 0; } …

1
ตัวดำเนินการใหม่ () ทำงานแตกต่างกันเมื่อตัวดำเนินการลบ () ถูกลบทั้งนี้ขึ้นอยู่กับการมีอยู่ของตัวสร้างเริ่มต้น
การสร้างออบเจ็กต์ใหม่ของคลาส C โดยมีโอเปอเรเตอร์ new () ให้ข้อผิดพลาดที่นี่: class C { public: C() {} virtual ~C() {} void operator delete(void*) = delete; }; int main() { C* c = new C; } กับ C2280: 'void C::operator delete(void *)': function was explicitly deleted แต่เมื่อฉันแทนที่C() {} ด้วยC() = default; หรือลบบรรทัดเพื่อให้คอมไพเลอร์แทรกตัวสร้างเริ่มต้น (ซึ่งฉันเชื่อว่ามีผลเหมือนกันกับ= default) รหัสจะรวบรวมและเรียกใช้ อะไรคือความแตกต่างระหว่างตัวสร้างเริ่มต้นที่คอมไพเลอร์ที่สร้างโดยผู้ใช้ที่กำหนดโดยค่าเริ่มต้นที่ทำให้สิ่งนี้เกิดขึ้น? …

2
การกระโดดข้ามการกำหนดค่าเริ่มต้นของตัวแปรไม่ถูกต้องหรือทำให้เกิดพฤติกรรมที่ไม่ได้กำหนดหรือไม่?
พิจารณารหัสนี้: void foo() { goto bar; int x = 0; bar: ; } GCC และ Clang ปฏิเสธเนื่องจากการข้ามไปยังการbar:ข้ามการกำหนดค่าเริ่มต้นของตัวแปร MSVC ไม่บ่นเลย (ยกเว้นการใช้xหลังจากbar:ทำให้เกิดการเตือน) เราสามารถทำสิ่งเดียวกันด้วยswitch: void foo() { switch (0) { int x = 0; case 0: ; } } ตอนนี้ทั้งสามคอมไพเลอร์ปล่อยข้อผิดพลาด ตัวอย่างเหล่านั้นไม่ดีหรือไม่ หรือพวกเขาทำให้ UB? ฉันเคยคิดว่าทั้งสองรูปแบบไม่ดี แต่ฉันไม่สามารถหาส่วนที่น่ารำคาญของมาตรฐาน [stmt.goto]ไม่ได้พูดอะไรเกี่ยวกับเรื่องนี้และไม่ไม่[stmt.select]

4
enum C ++ ต่อเนื่อง 11
มีวิธีการเช็คอินใน C ++ 11 ไหมถ้า enum ต่อเนื่องหรือไม่? มันถูกต้องอย่างสมบูรณ์เพื่อให้ค่า enum ที่ไม่ได้ อาจมีคุณสมบัติเช่นลักษณะประเภทใน C ++ 14, C ++ 17 หรืออาจ C ++ 20 เพื่อตรวจสอบว่า enum เป็นแบบต่อเนื่องหรือไม่ สิ่งนี้จะใช้ใน static_assert ตัวอย่างเล็ก ๆ ดังนี้: enum class Types_Discontinuous { A = 10, B = 1, C = 100 }; enum class Types_Continuous { A = 0, …
17 c++  c++11  c++14  c++17  c++20 

1
เหตุใดไฟล์จัดการมาตรฐาน C ++ จึงหาวิธีการใช้งาน
C ++ ใช้streamoffชนิดเพื่อแสดงออฟเซ็ตภายในสตรีม (ไฟล์) และกำหนดไว้ดังนี้ใน [stream.types]: using streamoff = implementation-defined ; ประเภท streamoff เป็นคำพ้องความหมายสำหรับหนึ่งในประเภทอินทิกรัลพื้นฐานที่ลงนามแล้วซึ่งมีขนาดเพียงพอที่จะแสดงขนาดไฟล์สูงสุดที่เป็นไปได้สำหรับระบบปฏิบัติการ 287) 287) ความยาวโดยทั่วไป สิ่งนี้สมเหตุสมผลเนื่องจากอนุญาตให้ค้นหาไฟล์ขนาดใหญ่ (ต่างจากการใช้longซึ่งอาจมีความกว้างเพียง 32 บิต) [filebuf.virtuals] กำหนดbasic_filebufฟังก์ชั่นของการค้นหาภายในไฟล์ดังนี้: pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override; off_typeเทียบเท่ากับstreamoffดู [iostreams.limits.pos] อย่างไรก็ตามมาตรฐานก็จะอธิบายผลกระทบของฟังก์ชั่น ฉันรู้สึกหงุดหงิดกับประโยคสุดท้ายที่ต้องเรียกร้องให้fseek: ผลกระทบ : อนุญาตwidthแสดงa_codecvt.encoding()ว่า หากis_open() == falseหรือoff != 0 && width <= …

2
นี่เป็นตัวสร้างลักษณะ C ++ เก่าหรือไม่
นี่คือโค้ด C ++ ในตัวอย่างนี้บล็อคโค้ดจำนวนมากมีลักษณะเหมือนการเรียกคอนสตรัคเตอร์ น่าเสียดายที่รหัสบล็อก # 3 ไม่ใช่ (คุณสามารถตรวจสอบได้โดยใช้https://godbolt.org/z/q3rsxnและhttps://cppinsights.io ) ฉันคิดว่ามันเป็นสัญกรณ์ C ++ เก่าและสามารถอธิบายการแนะนำของสัญกรณ์การก่อสร้าง C ++ 11 ใหม่โดยใช้ {} (cf # 4) คุณมีคำอธิบายสำหรับT(i)ความหมายใกล้กับสัญกรณ์คอนสตรัคชัน แต่แตกต่างกันอย่างแน่นอน? struct T { T() { } T(int i) { } }; int main() { int i = 42; { // #1 T t(i); // new T …
17 c++  c++11 

1
เสียงดังกราวถูกต้องหรือไม่ในการปฏิเสธรหัสที่คลาสที่ซ้อนกันของแม่แบบคลาสนั้นถูกกำหนดผ่านความเชี่ยวชาญเฉพาะทางหรือไม่
รับแม่แบบชั้นเรียนต่อไปนี้: template<typename T> struct Outer { struct Inner; auto f(Inner) -> void; }; เรากำหนดInnerแยกต่างหากสำหรับแต่ละความเชี่ยวชาญของOuter: template<> struct Outer<int>::Inner {}; template<> struct Outer<double>::Inner {}; จากนั้นกำหนดฟังก์ชันสมาชิกfหนึ่งครั้งสำหรับความเชี่ยวชาญพิเศษทั้งหมดของOuter: auto Outer<T>::f(Inner) -> void { } แต่เสียงดังกราว (9.0.0) บ่น: error: variable has incomplete type 'Outer::Inner' auto Outer<T>::f(Inner) -> void ^ เราสามารถหลบเลี่ยงข้อผิดพลาดของคอมไพเลอร์โดยให้คำจำกัดความของInnerความเชี่ยวชาญอื่น ๆ ของOuter: template<typename T> struct Outer<T>::Inner …


3
มีวิธีการติดตั้ง Valgrind บน Catalina หรือไม่?
มีวิธีการติดตั้ง Valgrind บน Catalina และให้มันทำงานอย่างถูกต้องหรือไม่? ถ้าเป็นเช่นนั้นฉันจะขอบคุณกระบวนการทีละขั้นตอน ฉันพยายามติดตั้ง Valgrind ด้วยhttps://github.com/sowson/valgrind แต่เมื่อฉันทดสอบhelloWorld.cppบนเทอร์มินัลคอนโซลคืนข้อผิดพลาดที่ฉันไม่ควรได้รับ ฉันไม่แน่ใจว่าฉันยอมรับข้อผิดพลาดในส่วนของฉันในกระบวนการติดตั้งของรุ่น Valgrind นี้หรือหากตัวเอง Valgrind ไม่เข้ากันกับ Catalina OS ฉันได้ลองติดตั้ง Valgrind ผ่าน Homebrew แล้ว แต่ฉันก็มีปัญหาเช่นกัน (github.com/Homebrew/homebrew-core/issues/36683)

1
gotchas ใด ๆ ที่แทนที่ global const char [] ด้วย constexpr string_view?
ทีมงานของเรากำลังทำงานกับรหัสฐาน C ++ อายุมากกว่า 10 ปีและเพิ่งเปลี่ยนเป็นคอมไพเลอร์ C ++ 17 ดังนั้นเรากำลังมองหาวิธีปรับปรุงรหัสของเราให้ทันสมัย ในการพูดคุยประชุมบน YouTube ผมได้ยินข้อเสนอแนะเพื่อแทนที่สตริงระดับโลกที่มีconst char*constexpr string_view เนื่องจากเรามีconst char*ค่าคงที่สตริงทั่วโลกจำนวนมากในรหัสของเราฉันต้องการถามว่ามี gotchas หรือปัญหาที่อาจเกิดขึ้นที่เราต้องระวังหรือไม่?

4
ทำไม std :: function ไม่เข้าร่วมในการแก้ปัญหาโอเวอร์โหลด?
ฉันรู้ว่ารหัสต่อไปนี้จะไม่รวบรวม void baz(int i) { } void baz() { } class Bar { std::function<void()> bazFn; public: Bar(std::function<void()> fun = baz) : bazFn(fun){} }; int main(int argc, char **argv) { Bar b; return 0; } เนื่องจากstd::functionมีการกล่าวว่าไม่ต้องพิจารณาความละเอียดที่มากเกินไปเช่นที่ฉันอ่านในโพสต์นี้ ฉันไม่เข้าใจข้อ จำกัด ทางเทคนิคที่บังคับให้ใช้โซลูชันประเภทนี้อย่างเต็มที่ ฉันอ่านเกี่ยวกับขั้นตอนการแปลและเทมเพลตใน cppreference แต่ฉันไม่สามารถคิดได้ว่ามีเหตุผลใดที่ฉันไม่สามารถหาตัวอย่างตัวอย่างได้ อธิบายให้คนธรรมดาสามัญคนหนึ่ง (ยังใหม่กับ C ++) อะไรที่และในระหว่างขั้นตอนการแปลที่ทำให้ข้างต้นล้มเหลวในการรวบรวม?

2
เทมเพลตโอเวอร์โหลดที่ไม่ชัดเจน
ฉันมีรหัสเทมเพลตต่อไปนี้ #include <vector> #include <array> #include <iostream> template<typename T1> void foo(std::vector<T1> bar) { std::cout << "GENERIC" << std::endl; } template<typename T1> void foo(std::vector<std::vector<T1>> bar) { std::cout << "SPECIFIC (vector)" << std::endl; } template<typename T1, int SIZE> void foo(std::vector<std::array<T1, SIZE>> bar) { std::cout << "SPECIFIC (array)" << std::endl; } int main() …
16 c++  templates 

3
การปรับฟังก์ชั่นวัตถุประสงค์ R ให้เหมาะสมกับ Rcpp ช้าลงทำไม?
ขณะนี้ฉันกำลังทำงานกับวิธีแบบเบย์ที่ต้องการหลายขั้นตอนของการเพิ่มประสิทธิภาพของแบบจำลองการบันทึกหลายส่วนต่อการวนซ้ำ ฉันใช้ optim () เพื่อดำเนินการ optimisations เหล่านั้นและฟังก์ชั่นวัตถุประสงค์ที่เขียนใน R การทำโปรไฟล์เปิดเผยว่า optim () เป็นคอขวดหลัก หลังจากขุดไปรอบ ๆ ฉันพบคำถามนี้ซึ่งพวกเขาแนะนำว่าการบันทึกฟังก์ชันวัตถุประสงค์ด้วยRcppสามารถทำให้กระบวนการเร็วขึ้น ฉันทำตามข้อเสนอแนะและบันทึกฟังก์ชั่นวัตถุประสงค์ของฉันRcppใหม่ แต่มันก็ช้าลง (ช้าลงประมาณสองเท่า!) นี่เป็นครั้งแรกของฉันที่มีRcpp(หรืออะไรก็ตามที่เกี่ยวข้องกับ C ++) และฉันไม่สามารถหาวิธีการเขียนโค้ดเวกเตอร์ได้ มีความคิดอย่างไรที่จะทำให้เร็วขึ้น? Tl; dr: การใช้งานฟังก์ชั่นปัจจุบันใน Rcpp ไม่เร็วเท่ากับ vectorised R; จะทำให้เร็วขึ้นได้อย่างไร? ตัวอย่างที่ทำซ้ำได้ : 1) กำหนดฟังก์ชั่นวัตถุประสงค์ในRและRcpp: ความน่าจะเป็นของการสกัดกั้นแบบจำลองแบบมัลติโนเมียลเท่านั้น library(Rcpp) library(microbenchmark) llmnl_int <- function(beta, Obs, n_cat) { n_Obs <- length(Obs) Xint <- matrix(c(0, …
16 c++  r  optimization  rcpp 

2
วิธีส่งการอ้างอิงไปยังอาร์กิวเมนต์ชื่อเทมเพลต
มีวิธีส่งการอ้างอิงเป็นอาร์กิวเมนต์ไปยังอาร์กิวเมนต์พิมพ์ชื่อแม่แบบหรือไม่ ฉันหมายถึงเช่นนั้นแทนที่จะผ่าน int ตัวอย่างเช่นเพื่อส่งการอ้างอิงไปยัง int template <typename T> struct Foo { Foo(T arg) : ptr(arg) {} T ptr; }; int main() { int* a = new int(6); Foo<decltype(a)> foo1(a); // ptr is a copy of a pointer Foo<decltype(&a)> foo1(&a); // ptr seems to be a pointer to a pointer } …
16 c++  templates 

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