Tag: c ++ 11

C ++ 11基于反向范围的for-loop

是否有一个容器适配器,将颠倒迭代器的方向,所以我可以遍历一个容器反向与基于范围的for循环? 用显式的迭代器,我会转换这个: for (auto i = c.begin(); i != c.end(); ++i) { … 进入这个: for (auto i = c.rbegin(); i != c.rend(); ++i) { … 我想转换这个: for (auto& i: c) { … 对此: for (auto& i: std::magic_reverse_adapter(c)) { … 有这样的事情,还是我自己写?

如何在CMake中激活C ++ 11?

当我尝试运行CMake生成的makefile来编译我的程序时,出现错误 C ++ 98模式不支持基于范围的循环。 我尝试添加add_definitions(-std=c++0x)到我的CMakeLists.txt ,但它没有帮助。 我也试过这个: if(CMAKE_COMPILER_IS_GNUCXX) add_definitions(-std=gnu++0x) endif() 当我做g++ –version ,我得到: g ++(Ubuntu / Linaro 4.6.1-9ubuntu3)4.6.1 我也试过SET(CMAKE_CXX_FLAGS "-std=c++0x") ,这也不起作用。 我不明白如何使用CMake激活C ++ 11function。

如何用c ++ 11 CAS实现ABA计数器?

我正在实现基于此algorithm的无锁队列,该algorithm使用计数器来解决ABA问题。 但是我不知道如何用c ++ 11 CAS来实现这个计数器。 例如,从algorithm: E9: if CAS(&tail.ptr->next, next, <node, next.count+1>) 这是一个primefaces操作,意思是如果tail.ptr->next等于next ,则让tail.ptr->next指向node , 同时(primefaces地)使next.count+1 。 但是,使用C ++ 11 CAS,我只能实现: std::atomic_compare_exchange_weak(&tail.ptr->next, next, node); 不能使next.count+1同时发生。

右值参考被视为左值?

我发布了这个答案: https : //stackoverflow.com/a/28459180/2642059其中包含以下代码: void foo(string&& bar){ string* temp = &bar; cout << *temp << " @:" << temp << endl; } 是一个右值还是左值? 我问,因为我显然不能接受一个右值的地址,但我可以像在这里所做的那样,使用右值引用的地址。 如果你可以对右值引用进行右值引用的任何操作,那么使用“&&”而不是“&”区分两者的意义何在?

在c + + 11中string :: c_str()不再是空的吗?

在C ++ 11中, basic_string::c_str被定义为与basic_string::data完全相同,这又被定义为与*(begin() + n)和*(&*begin() + n) (当0 <= n < size() )时。 我找不到任何需要string在其末尾始终为空的字符。 这是否意味着c_str()不再保证产生一个以null结尾的string?

为什么std :: function不平等?

这个问题也适用于boost::function和std::tr1::function 。 std::function不相等: #include <functional> void foo() { } int main() { std::function<void()> f(foo), g(foo); bool are_equal(f == g); // Error: f and g are not equality comparable } 在C ++ 11中, operator==和operator!= overload是不存在的。 在早期的C ++ 11草案中,重载被声明为删除(N3092§20.8.14.2): // deleted overloads close possible hole in the type system 它没有说出“types系统中可能存在的漏洞”是什么。 在TR1和Boost中,重载是声明的,但没有定义。 TR1规范注释(N1836§3.7.2.6): 这些成员函数应该是未定义的。 [ 注意:类似布尔的转换会打开一个漏洞,通过==或!=来比较两个函数实例。 这些未定义的void操作符closures了漏洞,并确保编译时错误。 – […]

在C ++ 11中创buildN元素constexpr数组

你好我正在学习C ++ 11,我想知道如何使一个constexpr 0到n数组,例如: n = 5; int array[] = {0 … n}; 所以数组可能是{0, 1, 2, 3, 4, 5}

std :: forward如何工作?

可能重复: 使用forward的优点 我知道它做什么,什么时候使用它,但我仍然无法围绕它如何工作。 请尽可能详细地说明,如果允许使用模板参数推导, std::forward将不正确。 我的一部分混乱是这样的:“如果它有一个名字,这是一个左值” – 如果这是为什么std::forward行为不同,当我通过thing&& x与thing& x ?

漂亮的std ::元组

这是我之前关于漂亮打印STL容器的问题的一个后续,为此我们开发了一个非常优雅和全面的通用解决scheme。 在接下来的步骤中,我想包含std::tuple<Args…>漂亮打印,使用可变参数模板(所以这完全是C ++ 11)。 对于std::pair<S,T> ,我只是说 std::ostream & operator<<(std::ostream & o, const std::pair<S,T> & p) { return o << "(" << p.first << ", " << p.second << ")"; } 什么是打印元组的类似结构? 我尝试了各种各样的模板参数堆栈解包,传递索引,并使用SFINAE来发现当我在最后一个元素,但没有成功。 我不会用我破碎的代码来加重你的负担。 问题描述有希望足够简单。 基本上,我想要以下行为: auto a = std::make_tuple(5, "Hello", -0.1); std::cout << a << std::endl; // prints: (5, "Hello", -0.1) 与上一个问题一样包含相同级别的通用性(char / wchar_t,一对分隔符)!

很好的方式来追加向量自己

我想复制向量的内容,并希望它们被添加到原始向量的末尾,即v[i]=v[i+n] for i=0,2,…,n-1 我正在寻找一个很好的方式来做到这一点,而不是一个循环。 我看到std::vector::insert但迭代版本禁止迭代器*this (即行为是未定义的)。 我也尝试了std::copy如下(但它导致分段错误): copy( xx.begin(), xx.end(), xx.end());