Tag: c ++ 11

概念和模板约束之间有什么区别?

我想知道C ++完整概念提案和模板约束(例如,Dlang中出现的约束或C ++ 1y的新概念精简build议 )之间的语义差异。 什么是比模板约束能做的完整概念不能做到的?

shared_ptr在哪里?

几个小时后,我非常沮丧,试图findshared_ptr所在的位置。 我看到的例子都没有显示完整的代码来包含shared_ptr (和working)的头文件。 简单地说std , tr1和<memory>完全没有帮助! 我已经下载提升和所有,但仍然不显示! 有人可以帮助我确切地知道在哪里find它吗? 感谢让我发泄我的挫折! 编辑:我看到我的标题已经改变。 对于那个很抱歉。 所以…这也是因为我不清楚shared_ptr是“C ++版本依赖” – >这就是为什么我没有说明我的环境 – >因此,可能为什么我很难find它。 我正在MSVS2008上工作。 编辑2:我不知道为什么,但我包括[内存]和[boost / tr1 / memory.hpp]和[boost / tr1 / tr1 /内存],而无处不在寻找shared_ptr ..当然,我couldn “T。 感谢所有的答复。

为什么不是std :: initializer_list是一种内置的语言?

为什么不是std::initializer_list是内置的核心语言? 在我看来,这是C ++ 11的一个非常重要的特性,但它没有自己的保留关键字(或类似的东西)。 相反, initializer_list 只是标准库中的一个模板类,它具有来自编译器处理的新的braced-init-list {…}语法的特殊隐式映射 。 起初以为,这个解决scheme是相当黑客 。 这就是现在实现C ++语言的新增function:通过某些模板类的隐式angular色而不是核心语言? 请考虑这些例子: widget<int> w = {1,2,3}; //this is how we want to use a class 为什么select了一个新class级: widget( std::initializer_list<T> init ) 而不是使用类似于任何这些想法的东西: widget( T[] init, int length ) // (1) widget( T… init ) // (2) widget( std::vector<T> init ) // (3) 一个经典的数组,你可以在这里和那里添加const 语言中已经存在三个点(var-args,现在是可变参数模板),为什么不重用语法(并使之感觉内置 […]

可变参数模板上下文中“…”标记的规则是什么?

在C ++ 11中有像这样的可变参数模板: template< class T, class… Args > unique_ptr<T> make_unique( Args&&… args ) { return unique_ptr<T>(new T(std::forward<Args>(args)…)); } 这里有一些好奇心:expression式std::forward<Args>(args)…使用Args和args但只有一个…标记。 此外, std::forward是一个非variables模板函数,只需要一个模板参数和一个参数。 这个(粗略的)是什么语法规则? 怎么可以推广? 另外:在函数实现中,省略号( … )在感兴趣的expression式的末尾。 是否有一个原因,在模板参数列表和参数列表省略号在中间?

我可以在C ++中实现一个自治的`self`成员types吗?

C ++ 缺乏 PHP的self关键字的等价物,它的计算结果是封闭类的types。 以每class为基础很容易伪造: struct Foo { typedef Foo self; }; 但是我不得不再次写Foo 。 也许我有一天会得到这个错误,并导致一个沉默的错误。 我可以使用一些decltype和朋友的组合来使这项工作“自主”吗? 我已经尝试了以下内容,但在这个地方无效: struct Foo { typedef decltype(*this) self; }; // main.cpp:3:22: error: invalid use of 'this' at top level // typedef decltype(*this) self; (我不会担心static ,相同的,但后期绑定。)

C ++ 11中的“final”关键字用于函数的目的是什么?

C ++ 11中final关键字的作用是什么? 我知道它可以防止派生类重写函数,但如果是这样的话,那么声明为非虚拟的final函数还不够吗? 还有什么我在这里失踪?

gcc std :: unordered_map实现缓慢吗? 如果是这样 – 为什么?

我们正在用C ++开发一个高性能的关键软件。 在那里我们需要一个并发哈希映射并实现一个。 所以我们写了一个基准来计算出我们的并发哈希映射与std::unordered_map相比要慢多less。 但是, std::unordered_map似乎是非常慢…所以这是我们的微基准(对于并发映射,我们产生了一个新的线程,以确保locking不会被优化,注意我从来没有inser 0,因为我也基准google::dense_hash_map ,需要一个空值): boost::random::mt19937 rng; boost::random::uniform_int_distribution<> dist(std::numeric_limits<uint64_t>::min(), std::numeric_limits<uint64_t>::max()); std::vector<uint64_t> vec(SIZE); for (int i = 0; i < SIZE; ++i) { uint64_t val = 0; while (val == 0) { val = dist(rng); } vec[i] = val; } std::unordered_map<int, long double> map; auto begin = std::chrono::high_resolution_clock::now(); for (int i = 0; […]

如何自动将强types枚举转换为int?

#include <iostream> struct a { enum LOCAL_A { A1, A2 }; }; enum class b { B1, B2 }; int foo( int input ) { return input; } int main(void) { std::cout<<foo(a::A1)<<std::endl; std::cout<<foo(static_cast<int>(b::B2))<<std::endl; } a::LOCAL_A是强types枚举试图实现的内容,但是有一点区别:普通枚举可以转换为整数types,而强types枚举不能没有a::LOCAL_A转换。 那么,有没有办法将一个强types的枚举值转换为一个整型没有转换? 如果是的话,怎么样?

如果你static_cast无效的值枚举类会发生什么?

考虑一下这个C ++ 11代码: enum class Color : char { red = 0x1, yellow = 0x2 } // … char *data = ReadFile(); Color color = static_cast<Color>(data[0]); 假设数据[0]实际上是100.什么是根据标准设置的颜色? 特别是,如果我稍后做 switch (color) { // … red and yellow cases omitted default: // handle error break; } 标准保证默认会被打中吗? 如果没有,那么在这里检查错误的适当,最有效,最优雅的方法是什么? 编辑: 作为一个奖励,标准是否作出这方面的保证,但明确枚举?

如何简洁,便携地彻底种子PRNG?

我似乎看到很多答案,其中有人build议使用<random>来产生随机数,通常伴随着这样的代码: std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<> dis(0, 5); dis(gen); 通常这会取代某种“不圣洁的憎恶”,比如: srand(time(NULL)); rand()%6; 我们可以通过争论time(NULL)提供低熵, time(NULL)是可预测的,最终结果是不一致的来批评旧的方法。 但所有这一切都是新的方式:它只是有一个更光泽的单板。 rd()返回一个unsigned int 。 这至less有16位,可能是32.这不足以种子MT的19937位的状态。 使用std::mt19937 gen(rd());gen() (用32位播种并查看第一个输出)不能提供良好的输出分布。 7和13永远不会是第一个输出。 两颗种子产生0.12颗种子产生1226181350.( 链接 ) std::random_device可以是,有时是作为一个简单的PRNG与一个固定的种子实现。 因此,它可能会在每次运行中产生相同的序列。 ( 链接 )这比time(NULL)更差time(NULL) 。 更糟糕的是,复制和粘贴上述代码片段非常容易,尽pipe它们包含的问题。 有些解决scheme需要获取可能不适合每个人的大型 图书馆 。 鉴于此,我的问题是如何简洁,便携地将C ++中的PRNG彻底播种? 鉴于上述问题,一个很好的答案: 必须完全种下mt19937 / mt19937_64。 不能单纯依靠std::random_device或time(NULL)作为熵源。 不应该依靠Boost或其他库文库。 应适合less数几行,以便它看起来很好复制粘贴到一个答案。 思考 我目前的想法是std::random_device输出可以通过time(NULL) ,从地址空间随机化得到的值和一个硬编码的常量(可以在发布期间设置)来混合(也许通过XOR)在熵上尽力而为。 std::random_device::entropy() 并不能很好的说明std::random_device可能做什么或者不可以做什么。