Tag: c ++ 11

c ++ 0x:通过引用接收lambda作为参数的正确方法

什么是正确的方法来定义一个函数,通过引用接收int->int lambda参数? void f(std::function< int(int) >& lambda); 要么 void f(auto& lambda); 我不确定最后一种forms甚至是合法的语法。 是否有其他方法来定义一个lambda参数?

C ++ 11基于范围的循环,没有循环variables

在C + +我需要迭代一定的次数,但我不需要一个迭代variables。 例如: for( int x=0; x<10; ++x ) { /* code goes here, i do not reference "x" in this code */ } 我意识到我可以通过用“lambda”或“named”函数replace“code goes here”来做到这一点,但是这个问题是关于for循环的。 我希望C ++ 11的基于范围的循环将有助于: for( auto x : boost::irange(0,10) ) { /* code goes here, i do not reference "x" in this code */ } 但上面给出了“未引用的局部variables”,因为我从来没有明确地引用x。 我想知道是否有更优雅的方式来编写上面的循环,以便代码不会生成“未引用的局部variables”警告。

C ++ 11中已删除函数的确切语义是什么?

struct A { A(); A(const A&); A& operator =(const A&); A(A&&) = delete; A& operator =(A&&) = delete; }; struct B { B(); B(const B&); B& operator =(const B&); }; int main() { A a; a = A(); // error C2280 B b; b = B(); // OK } 我的编译器是VC ++ 2013 RC。 错误C2280:'A&A :: […]

如何在纯C / C ++(cout / printf)中显示进度指示器?

我正在用C ++编写一个控制台程序来下载一个大文件。 我已经知道文件的大小,我开始工作线程下载。 我想显示一个进度指示器,让它看起来更酷。 如何在不同的时间显示不同的string,但在相同的位置,在cout或printf?

当我们需要存储“最后的n个项目”时,列表是否比向量好?

有很多问题表明,应该总是使用一个向量,但是在我看来,一个列表对于这个场景来说会更好,我们需要存储“最后n个项目” 例如,假设我们需要存储最后看到的5个条目:迭代0: 3,24,51,62,37, 然后在每次迭代中,索引0处的项目被移除,并且在最后添加新项目: 迭代1: 24,51,62,37,8 迭代2: 51,62,37,8,12 似乎对于这个用例来说,对于一个向量,复杂度将是O(n),因为我们将不得不拷贝n个项目,但是在一个列表中,它应该是O(1),因为我们总是斩断头,并添加到尾巴每次迭代。 我的理解是正确的吗? 这是一个std :: list的实际行为?

如何执行“覆盖”关键字?

有没有什么办法强制在Visual C ++ 2012中使用C ++ 11 override关键字? (即如果我忘记说override ,那么我想得到一个警告/错误。)

reinterpret_cast创build一个普通的默认构造对象

cppreference †指出: 具有普通默认构造函数的对象可以通过在任何适当alignment的存储上使用reinterpret_cast来创build,例如,在使用std::malloc分配的std::malloc 。 这意味着以下是明确的代码: struct X { int x; }; alignas(X) char buffer[sizeof(X)]; // (A) reinterpret_cast<X*>(buffer)->x = 42; // (B) 三个问题如下: 那个报价是正确的吗? 如果是的话,那么X的使用寿命到了什么时候? 如果在线(B) ,它是否被视为获取存储的本身? 如果在线(A) ,如果在(A)和(B)之间有一个分支会有条件地构build一个X或其他吊舱, Y ? 在这方面,C ++ 11和C ++ 1z之间有什么变化吗? †请注意,这是一个旧的链接。 这个问题的措辞已经改变了。 它现在写道: 然而,与C不同的是,具有简单默认构造函数的对象不能通过简单地重新解释适当alignment的存储来创build,例如使用std::malloc分配的std::malloc :placement-new需要正式引入一个新对象,并避免潜在的未定义行为。

lambda需要捕获“this”来调用静态成员函数?

对于下面的代码: struct B { void g() { []() { B::f(); }(); } static void f(); }; g ++ 4.6给出了错误: test.cpp:在lambda函数中: test.cpp:44:21:error:'this'没有被捕获到这个lambda函数 (有趣的是,g ++ 4.5编译好的代码)。 这是g ++ 4.6中的一个bug,还是真的有必要捕获“this”参数来调用静态成员函数? 我不明白为什么它应该是,我甚至有资格与B::呼叫。

为什么不emplace_back()使用统一的初始化?

以下代码: #include <vector> struct S { int x, y; }; int main() { std::vector<S> v; v.emplace_back(0, 0); } 使用GCC编译时出现以下错误: In file included from c++/4.7.0/i686-pc-linux-gnu/bits/c++allocator.h:34:0, from c++/4.7.0/bits/allocator.h:48, from c++/4.7.0/vector:62, from test.cpp:1: c++/4.7.0/ext/new_allocator.h: In instantiation of 'void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& …) [with _Up = S; _Args = {int, int}; _Tp = S]': c++/4.7.0/bits/alloc_traits.h:265:4: required from 'static typename std::enable_if<std::allocator_traits<_Alloc>::__construct_helper<_Tp, […]

这个赋值运算符之后的和号是什么意思?

我正在阅读关于“五规则”的这个很好的答案 ,我注意到了一些我不记得以前看到的东西: class C { … C& operator=(const C&) & = default; C& operator=(C&&) & = default; … }; “复制赋值”操作符和“移动赋值”操作符在“ = default前放置的&字符的用途是什么? 有没有人有这个参考?