Questions tagged «c++»

C ++是一种通用编程语言。它最初被设计为C的扩展,并且具有类似的语法,但是现在它是一种完全不同的语言。使用此标记可解决有关将要使用C ++编译器编译的代码的问题。对于与特定标准修订版[C ++ 11],[C ++ 14],[C ++ 17]或[C ++ 20]等相关的问题,请使用特定于版本的标记。


4
将std :: transform与std :: back_inserter一起使用是否有效?
Cppreference具有以下示例代码std::transform: std::vector<std::size_t> ordinals; std::transform(s.begin(), s.end(), std::back_inserter(ordinals), [](unsigned char c) -> std::size_t { return c; }); 但这也说: std::transform不保证unary_op或的顺序应用binary_op。要将功能按顺序应用于序列或将功能修改序列的元素,请使用std::for_each。 大概是为了允许并行实现。但是,第三个参数std::transform是a LegacyOutputIterator,它具有以下条件++r: 此操作之后,r不需要是可递增的,并且r不再需要先前值的任何副本是可取消引用或可递增的。 因此在我看来,输出的分配必须按顺序进行。它们是否仅表示的应用程序unary_op可能会乱序,并存储到一个临时位置,但按顺序复制到输出中?这听起来不像您想做的事情。 大多数C ++库实际上尚未实现并行执行程序,但Microsoft已实现。我很确定这是相关的代码,并且我认为它调用此populate()函数来将迭代器记录到输出的大块中,这肯定不是一件有效的事情,因为 LegacyOutputIterator可以通过递增其副本来使其无效。 我想念什么?

2
为琐碎的对象在“ this”上调用新的展示位置是否安全?
我知道这个问题已经被问过好几次了,但是我找不到针对这种情况的答案。 假设我有一个琐碎的类,它不拥有任何资源,并且具有空的析构函数和默认构造函数。它具有少数带有类内初始化的成员变量;没有一个是const。 我想重新初始化和此类对象,而无需deInit手动编写方法。这样做是否安全? void A::deInit() { new (this)A{}; } 我看不到任何问题-对象始终处于有效状态,this仍然指向同一地址;但是它是C ++,所以我想确定。

3
向量强制转换中的未定义行为
为什么此代码编写了未定义数量的看似未初始化的整数? #include <iostream> #include <vector> using namespace std; int main() { for (int i : vector<vector<int>>{{77, 777, 7777}}[0]) cout << i << ' '; } 我期望输出是77 777 7777。 此代码是否应该未定义?
19 c++ 

2
整数->指针转换规则
考虑下面的代码。 void f(double p) {} void f(double* p) {} int main() { f(1-1); return 0; } MSVC 2017不会对此进行编译。它表明存在一个模棱两可的重载调用,因为1-1它与相同0,因此可以转换为double*。其他技巧,例如0x0,0L或static_cast<int>(0)也不起作用。甚至声明a const int Zero = 0和调用都会f(Zero)产生相同的错误。如果Zero不是,它只能正常工作const。 似乎同一问题适用于GCC 5及以下版本,但不适用于GCC6。我很好奇这是否是C ++标准的一部分,已知的MSVC错误或编译器中的设置。粗略的Google并未产生结果。
19 c++  visual-c++  types 

3
循环内的c ++线程输出错误的值
我试图理解c ++中的多线程,但是我陷入了这个问题:如果我在for循环中启动线程,它们会打印错误的值。这是代码: #include <iostream> #include <list> #include <thread> void print_id(int id){ printf("Hello from thread %d\n", id); } int main() { int n=5; std::list<std::thread> threads={}; for(int i=0; i<n; i++ ){ threads.emplace_back(std::thread([&](){ print_id(i); })); } for(auto& t: threads){ t.join(); } return 0; } 我原本希望打印出0、1、2、3、4的值,但是我经常两次得到相同的值。这是输出: Hello from thread 2 Hello from thread 3 …



1
为什么std :: atomic构造函数在C ++ 14和C ++ 17中表现不同
我在使用C ++ 11的项目中工作,并且尝试了以下代码 #include <atomic> struct A { std::atomic_int idx = 1; }; int main() { return 0; } 我收到编译器错误 error: use of deleted function 'std::__atomic_base<_IntTp>::__atomic_base(const std::__atomic_base<_IntTp>&) [with _ITp = int]' std::atomic_int idx = 1; ^ 对于C ++ 14,结果相同。当我切换到C ++ 17时,它可以工作:wandbox 我检查了cppreference的区别: std::atomic std::atomic<T>::operator= std::atomic<T>::atomic 但是C ++ 14和C ++ 17之间没有任何区别。为什么它与C …
19 c++  c++14  c++17  stdatomic 

2
为什么same_as概念两次检查类型相等性?
在https://en.cppreference.com/w/cpp/concepts/same_as上查看same_as概念的可能实现,因为我注意到正在发生奇怪的事情。 namespace detail { template< class T, class U > concept SameHelper = std::is_same_v<T, U>; } template< class T, class U > concept same_as = detail::SameHelper<T, U> && detail::SameHelper<U, T>; 第一个问题是为什么要插入一个SameHelper概念?第二个就是same_as检查是否T相同U和U一样T?这不是多余的吗?
19 c++  c++20  concept 


5
如何解决悬空的const ref
以下简短程序 #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
Lambda闭包左值可以作为右值参考参数传递
我发现lvaluelambda闭包始终可以作为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
删除操作符delete()时,操作符new()的行为会有所不同,具体取决于默认构造函数的存在
使用运算符new()创建类C的新对象会在此处产生错误: 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),该代码将编译并运行。 使编译器生成的默认构造函数和用户定义的默认构造函数之间发生什么区别? 我在这篇文章中得到了一些提示,但是这里的C类(没有用户提供的构造函数)并不简单,因为析构函数是虚拟的,对吗? 与最新的Visual Studio c ++ 17一起编译。

4
连续枚举C ++ 11
有没有一种方法可以在C ++ 11中检查枚举是否连续? 给出一个不是的枚举值是完全有效的。在C ++ 14,C ++ 17或C ++ 20中是否可能有类似类型特征的功能来检查枚举是否连续?这将在static_assert中使用。 一个小例子如下: enum class Types_Discontinuous { A = 10, B = 1, C = 100 }; enum class Types_Continuous { A = 0, B = 1, C = 2 }; static_assert(SOME_TEST<Types_Discontinuous>::value, "Enum should be continuous"); // Fails static_assert(SOME_TEST<Types_Continuous>::value, "Enum should be …
17 c++  c++11  c++14  c++17  c++20 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.