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

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

3
ฟังก์ชั่นแม่แบบไม่ทำงานสำหรับตัวชี้ไปยังสมาชิกฟังก์ชั่นการอ้างอิง const
เมื่อเร็ว ๆ นี้ฉันได้เขียนฟังก์ชั่นเทมเพลตเพื่อแก้ปัญหาการทำซ้ำรหัสบางอย่าง ดูเหมือนว่านี้: template<class T, class R, class... Args> R call_or_throw(const std::weak_ptr<T>& ptr, const std::string& error, R (T::*fun)(Args...), Args... args) { if (auto sp = ptr.lock()) { return std::invoke(fun, *sp, args...); } else { throw std::runtime_error(error.c_str()); } } int main() { auto a = std::make_shared<A>(); call_or_throw(std::weak_ptr<A>(a), "err", &A::foo, 1); …
14 c++  templates 

3
std :: bit_cast พร้อม std :: array
ในการพูดคุยล่าสุดของเขา“ชนิดเล่นสำนวนในปัจจุบัน c ++”มู Doumler กล่าวว่าstd::bit_castไม่สามารถนำมาใช้เพื่อบิตโยนfloatลงไปunsigned char[4]เพราะอาร์เรย์แบบ C ไม่สามารถกลับมาจากฟังก์ชั่น เราควรใช้std::memcpyหรือรอจนกว่า C ++ 23 (หรือหลังจากนั้น) เมื่อสิ่งที่ชอบreinterpret_cast<unsigned char*>(&f)[i]จะกลายเป็นชัดเจน ใน C ++ 20 เราสามารถใช้std::arrayกับstd::bit_cast, float f = /* some value */; auto bits = std::bit_cast<std::array<unsigned char, sizeof(float)>>(f); แทนที่จะเป็นอาร์เรย์แบบ C เพื่อรับจำนวนไบต์float?

1
การใช้ c ++ nullptr ทำงานอย่างไร
ฉันอยากรู้ว่าnullptrทำงานอย่างไร มาตรฐาน N4659 และ N4849 พูดว่า: มันจะต้องมีประเภทstd::nullptr_t; คุณไม่สามารถใช้ที่อยู่ของมัน มันสามารถแปลงเป็นตัวชี้และตัวชี้ไปยังสมาชิกโดยตรง sizeof(std::nullptr_t) == sizeof(void*); การแปลงboolเป็นfalse; ค่าของมันสามารถแปลงเป็นประเภทอินทิกรัลเหมือนกัน(void*)0แต่ไม่ย้อนหลัง ดังนั้นมันจึงเป็นค่าคงที่ที่มีความหมายเหมือน(void*)0กัน แต่มีชนิดที่แตกต่างกัน ฉันพบการใช้งานstd::nullptr_tบนอุปกรณ์ของฉันและเป็นดังนี้ #ifdef _LIBCPP_HAS_NO_NULLPTR _LIBCPP_BEGIN_NAMESPACE_STD struct _LIBCPP_TEMPLATE_VIS nullptr_t { void* __lx; struct __nat {int __for_bool_;}; _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR nullptr_t() : __lx(0) {} _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR nullptr_t(int __nat::*) : __lx(0) {} _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR operator int __nat::*() const {return …

3
คัดลอกการเริ่มต้นรายการหรือไม่ ทำไมคอมไพล์นี้?
ฉันใช้ Microsoft Visual Studio Community 2019, V16.5.2 ฉันต้องการทดสอบการเริ่มต้นรายการ โปรดดูโปรแกรมทดสอบต่อไปนี้: #include <string> void foo(std::string str) {} int main() { foo( {"str1", "str2"} ); return 0; } คอมไพล์โดยไม่มีข้อผิดพลาดและคำเตือน ทำไม? มันให้ข้อผิดพลาด runtime: Expression: Transposed pointer range ใครช่วยอธิบายหน่อยได้ไหมว่าเกิดอะไรขึ้นที่นี่ แก้ไข ฉันแยกรหัสออกและรันในตัวดีบัก foo( {"str1", "str2"} ); 00F739A8 sub esp,1Ch 00F739AB mov esi,esp 00F739AD mov dword ptr …
13 c++ 

1
std :: is_constructible ส่งคืนค่าที่ไม่สอดคล้องกันสำหรับตัวสร้างส่วนตัว
อะไรคือกฎที่ใช้ในการstd::is_constructibleก่อสร้างส่วนตัว? รับรหัสต่อไปนี้: #include <iostream> class Class { private: Class() { } }; template <typename T> class Test { public: static void test() { std::cout //<< std::is_constructible<Class>::value << std::is_constructible<T>::value << std::endl; } }; int main() { Test<Class>::test(); } ภาพพิมพ์นี้0( ideone ) Tคือไม่สามารถกำหนดค่าเริ่มต้นได้ ไม่ใส่เครื่องหมายในบรรทัดที่คอมเม้นต์มันจะพิมพ์11( ideone ) ดังนั้นจึงTกลายเป็นค่าเริ่มต้นที่สามารถสร้างได้ ฉันสามารถหาเหตุผลในการสนับสนุนผลลัพธ์ทั้งสอง แต่ฉันไม่เข้าใจว่าการรวมบรรทัดที่ถูกคอมเม้นต์นั้นเปลี่ยนแปลงผลลัพธ์ของวินาทีได้อย่างไร นี่คือสิ่งที่เรียก UB หรือไม่? …
13 c++  typetraits 

1
ปัญหาคอมไพเลอร์ C ++ พร้อมโครงสร้างในคลาสเทมเพลต
รหัสต่อไปนี้ไม่ได้รวบรวมกับ gcc หรือเสียงดังกราว template<class T> class foo{}; template<class T> class template_class_with_struct { void my_method() { if(this->b.foo < 1); }; struct bar { long foo; } b; }; ข้อความแสดงข้อผิดพลาดคือ error: type/value mismatch at argument 1 in template parameter list for 'template<class T> class foo' 8 | if(this->b.foo < 1); ข้อผิดพลาดเกิดจากคลาส templat …

3
ดำเนินการฟังก์ชันภายในเทมเพลตฟังก์ชันเฉพาะสำหรับประเภทที่มีฟังก์ชันกำหนดไว้เท่านั้น
ฉันมีเทมเพลตฟังก์ชั่นที่ใช้หลายประเภทเนื่องจากอินพุต มีเพียงหนึ่งประเภทเท่านั้นที่มีgetInt()ฟังก์ชัน ดังนั้นฉันต้องการรหัสเพื่อเรียกใช้ฟังก์ชันเฉพาะสำหรับประเภทนั้น กรุณาแนะนำวิธีแก้ปัญหา ขอบคุณ #include <type_traits> #include <typeinfo> class X { public: int getInt(){ return 9; } }; class Y{ }; template<typename T> void f(T& v){ // error: 'class Y' has no member named 'getInt' // also tried std::is_same<T, X>::value if(typeid(T).name() == typeid(X).name()){ int i = v.getInt();// I want …

2
const expr สามารถประเมินได้อย่างไรอย่างรวดเร็ว
ฉันได้ทดลองใช้นิพจน์ const ซึ่งประเมินเวลารวบรวม แต่ฉันเล่นกับตัวอย่างที่ดูเหมือนรวดเร็วอย่างไม่น่าเชื่อเมื่อดำเนินการในเวลารวบรวม #include<iostream> constexpr long int fib(int n) { return (n <= 1)? n : fib(n-1) + fib(n-2); } int main () { long int res = fib(45); std::cout << res; return 0; } เมื่อฉันเรียกใช้รหัสนี้ใช้เวลาประมาณ 7 วินาทีในการเรียกใช้ จนถึงตอนนี้ดีมาก แต่เมื่อฉันเปลี่ยนlong int res = fib(45)ไปconst long int res = fib(45)ก็จะใช้เวลาไม่ได้เป็นครั้งที่สอง …
13 c++  const  constexpr 

6
วิธีเปรียบเทียบ struct ทั่วไปใน C ++?
ฉันต้องการเปรียบเทียบ structs ด้วยวิธีทั่วไปและฉันทำบางสิ่งเช่นนี้ (ฉันไม่สามารถแบ่งปันแหล่งที่มาจริงได้ดังนั้นขอรายละเอียดเพิ่มเติมหากจำเป็น): template<typename Data> bool structCmp(Data data1, Data data2) { void* dataStart1 = (std::uint8_t*)&data1; void* dataStart2 = (std::uint8_t*)&data2; return memcmp(dataStart1, dataStart2, sizeof(Data)) == 0; } ส่วนใหญ่ใช้งานได้ตามที่ตั้งใจยกเว้นบางครั้งมันจะคืนค่าเท็จแม้ว่าอินสแตนซ์ของ struct สองรายการมีสมาชิกเหมือนกัน หลังจากค้นหาบางฉันพบว่าmemcmpสามารถล้มเหลวเนื่องจากโครงสร้างที่ใช้เป็นเบาะ มีวิธีที่เหมาะสมกว่าในการเปรียบเทียบหน่วยความจำที่ไม่แยแสกับการขยายหรือไม่ ฉันไม่สามารถแก้ไข structs ที่ใช้ (พวกเขาเป็นส่วนหนึ่งของ API ที่ฉันใช้) และ structs ที่แตกต่างกันจำนวนมากที่ใช้มีสมาชิกที่แตกต่างกันและดังนั้นจึงไม่สามารถเปรียบเทียบเป็นรายบุคคลในแบบทั่วไป (กับความรู้ของฉัน) แก้ไข: ฉันโชคไม่ดีติดอยู่กับ C ++ 11 ควรพูดถึงเรื่องนี้ก่อนหน้านี้ ...

4
วิธีการบรรลุอุปสรรค StoreLoad ใน C ++ 11?
ฉันต้องการเขียนโค้ดแบบพกพา (Intel, ARM, PowerPC ... ) ซึ่งแก้ปัญหาคลาสสิก: Initially: X=Y=0 Thread A: X=1 if(!Y){ do something } Thread B: Y=1 if(!X){ do something } ซึ่งเป้าหมายคือการหลีกเลี่ยงสถานการณ์ที่หัวข้อทั้งสองจะทำ something(ไม่เป็นไรหากไม่มีสิ่งใดทำงานนี่ไม่ใช่กลไกที่ทำงานเหมือนครั้งเดียว) โปรดแก้ไขให้ฉันถ้าคุณเห็นข้อบกพร่องบางอย่างในการให้เหตุผลด้านล่าง ฉันรู้ว่าฉันสามารถบรรลุเป้าหมายด้วยmemory_order_seq_cstอะตอมstoreและloads ดังต่อไปนี้: std::atomic<int> x{0},y{0}; void thread_a(){ x.store(1); if(!y.load()) foo(); } void thread_b(){ y.store(1); if(!x.load()) bar(); } ซึ่งบรรลุเป้าหมายเพราะจะต้องมีคำสั่งซื้อทั้งหมดเพียงคำสั่งเดียวใน {x.store(1), y.store(1), y.load(), x.load()}เหตุการณ์ซึ่งจะต้องเห็นด้วยกับ "ขอบ" ของคำสั่งโปรแกรม: x.store(1) …

3
วิธีที่เร็วที่สุดในการค้นหาผลิตภัณฑ์ขั้นต่ำขององค์ประกอบ 2 แถวที่มีองค์ประกอบมากกว่า 200,000 รายการ
ฉันมีอาเรa[n]ย์ หมายเลขnถูกป้อนโดยเรา ฉันต้องการค้นหาผลิตภัณฑ์ขั้นต่ำa[i]และa[j]ถ้า: 1) abs(i - j) > k 2) a[i] * a[j]ย่อเล็กสุด นี่คือทางออกของฉัน (ไร้เดียงสามาก): #include <iostream> using namespace std; #define ll long long int main() { ll n,k; cin >> n >> k; ll a[n]; for(ll i=0;i<n;i++) cin >> a[i]; ll mn; bool first = true; for(ll i=0;i<n;i++) { …

4
คำอธิบายของการสั่งซื้อที่ผ่อนคลายผิดพลาดใน cppreference หรือไม่?
ในเอกสารประกอบของstd::memory_orderบน cppreference.comมีตัวอย่างของการสั่งซื้อแบบผ่อนคลาย: สั่งผ่อนคลาย การดำเนินการของอะตอมมิกที่ติดแท็กmemory_order_relaxedไม่ใช่การดำเนินการทำข้อมูลให้ตรงกัน พวกเขาไม่ได้กำหนดลำดับการเข้าถึงหน่วยความจำพร้อมกัน พวกเขารับประกันเฉพาะอะตอมมิกและความสอดคล้องของคำสั่งแก้ไข ตัวอย่างเช่นเมื่อ x และ y เริ่มต้นที่ศูนย์ // Thread 1: r1 = y.load(std::memory_order_relaxed); // A x.store(r1, std::memory_order_relaxed); // B // Thread 2: r2 = x.load(std::memory_order_relaxed); // C y.store(42, std::memory_order_relaxed); // D ได้รับอนุญาตให้สร้าง r1 == r2 == 42 เพราะถึงแม้ว่า A จะถูกจัดลำดับก่อนหน้า B ภายในเธรด 1 และ C ถูกเรียงตามลำดับก่อนหน้า …

2
ถ้า constexpr ที่มี static_assert ในแลมบ์ดาคอมไพเลอร์ตัวไหนถูกต้อง?
เมื่อเราต้องการที่จะใช้static_assertในif constexprเราจะต้องทำให้เงื่อนไขขึ้นอยู่กับพารามิเตอร์แม่แบบบางอย่าง น่าสนใจ gcc และเสียงดังกราวไม่เห็นด้วยเมื่อโค้ดถูกห่อในแลมบ์ดา โค้ดต่อไปนี้คอมไพล์ด้วย gcc แต่เสียงดังกราวกระตุ้นการยืนยันแม้ว่าif constexprจะไม่เป็นจริงก็ตาม #include <utility> template<typename T> constexpr std::false_type False; template<typename T> void foo() { auto f = [](auto x) { constexpr int val = decltype(x)::value; if constexpr(val < 0) { static_assert(False<T>, "AAA"); } }; f(std::integral_constant<int, 1>{}); } int main() { foo<int>(); } ตัวอย่างที่อาศัยอยู่ที่นี่ …

1
ข้อผิดพลาดของคอมไพเลอร์ที่เป็นไปได้ใน MSVC
โค้ดต่อไปนี้คอมไพล์ด้วย gcc และ clang (และคอมไพเลอร์ C ++ 11 อื่น ๆ อีกมากมาย) #include <stdint.h> typedef int datatype; template <typename T> struct to_datatype {}; template <> struct to_datatype<int16_t> { static constexpr datatype value = 1; }; template <typename T> class data { public: data(datatype dt = to_datatype<T>::value) {} }; int main() { …
13 c++  c++11  visual-c++ 

1
เหตุใด swap ถูกเรียกโดย std :: sort ก็ต่อเมื่อคอนเทนเนอร์ของฉันมีองค์ประกอบมากกว่า 32 ตัว?
สวัสดีฉันมีคำถามง่าย ๆ : class A { public: A(int); A(const A&); A& operator=(const A&); ~A(); private: int* ptr_; friend bool operator<(const A&, const A&); friend void swap(A&, A&); }; A::A(int x) : ptr_(new int(x)) {} A::A(const A& rhs) : ptr_(rhs.ptr_ ? new int(*rhs.ptr_) : nullptr) {} A& A::operator = (const A …
13 c++  std  swap 

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