Tag: c ++ 11

可变的模板模板和完美的转发

这个关于对象生成器模式的问题让我想到了使它自动化的方法。 本质上,我想自动创build像std::make_pair , std::bind1st和std::mem_fun这样的函数,以便不必为每个模板类types编写不同的函数,可以编写单个可变模板模板函数即时处理所有案件。 这个函数的用法如下: make<std::pair>(1, 2); // equivalent to std::make_pair(1, 2) make<std::binder2nd>(&foo, 3); // equivalent to std::bind2nd(&foo, 3); 可以写这个函数吗? 我已经尝试过,但是在GCC 4.5或4.6中不起作用: template <template <typename…> class TemplateClass, typename… Args> TemplateClass<Args…> make(Args&&… args) { return TemplateClass<Args…>(std::forward<Args>(args)…); } 如果我尝试打电话(例如) make<std::pair>(1, 2)我只是得到 error: no matching function for call to 'make(int, int)' 我在这里的任何地方都有语法错误吗? 或者这是正确的,海湾合作委员会是错的? 或者,这只是在C ++ 0x从根本上不可能? [编辑] build议N2555似乎暗示这是允许的, […]

在不同的STL实现中,哪些algorithm用于C ++ 11 std :: sort?

C ++ 11标准保证std::sort 在最坏的情况下具有O(n logn)的复杂性 。 这与C ++ 98/03中的平均保证有所不同,在这种情况下 std::sort可以用Quicksort来实现(可能与小n的插入sorting相结合),在最坏的情况下有O(n ^ 2) (对于一些特定的input,例如sorting的input)。 不同的STL库中的std::sort实现有没有改变? C ++ 11的std::sort如何在不同的STL中实现?

哪个std :: async实现使用线程池?

使用std::async而不是手动创buildstd::thread对象的好处之一就是std::async可以在封面下使用线程池来避免超额订阅的问题。 但是,哪些实现这样做? 我的理解是微软的实现,但这些其他的async实现呢? Gnu的libstdc ++ Gnu的libc ++ Just Software的图书馆 升压(对于boost::thread::async ,而不是std::async ) 感谢您提供的任何信息。

使用GCC 4.7初始化初始化程序列表中的unique_ptrs容器失败

我试图以等同于Bjarne Stroustrup的C ++ 11 FAQ的例子初始化一个std::vector<std::unique_ptr<std::string>> : using namespace std; vector<unique_ptr<string>> vs { new string{"Doug"}, new string{"Adams"} }; // fails unique_ptr<string> ps { new string{"42"} }; // OK 我看不出为什么这个语法会失败。 这种初始化容器有什么问题吗? 编译器的错误信息是巨大的; 我find的相关细分如下: /usr/lib/gcc-snapshot/lib/gcc/i686-linux-gnu/4.7.0/../../../../include/c++/4.7.0 /bits/stl_construct.h:77 :7:错误:没有匹配函数调用'std::unique_ptr<std::basic_string<char> >::unique_ptr(std::basic_string<char>&)' 有什么办法来解决这个错误?

析构函数的使用=删除;

考虑以下课程: struct S { ~S() = delete; }; 不久,为了这个问题的目的:我不能像S s{};那样创buildS s{};实例S s{}; 因为我不能摧毁他们。 正如在评论中提到的,我仍然可以通过执行S *s = new S;来创build一个实例S *s = new S; ,但我不能删除它。 因此,我可以看到一个删除析构函数的唯一用法是这样的: struct S { ~S() = delete; static void f() { } }; int main() { S::f(); } 也就是说,定义一个仅暴露一堆静态函数的类,并禁止任何尝试创build该类的实例。 删除析构函数的其他用途(如果有的话)是什么?

std :: mt19937需要预热吗?

我读过很多伪随机数生成器需要许多样例才能被“预热”。 这是什么时候使用std :: random_device种子std :: mt19937,或者我们可以期望它已经准备好后,build设? 有问题的代码: #include <random> std::random_device rd; std::mt19937 gen(rd());

C ++ 11模式或emacs的设置?

我正在运行Emacs 23.3.1(Ubuntu,Oneiric软件包),emacs似乎并不了解任何新的C ++ 11关键字,constexpr,thread_local等。另外它不明白'>>'是现在允许使用模板参数,或新的“枚举类”语法。 有没有更新或替代模块? 或者做不到这一点,一些设置,使emacs更多的C + + 11友好的同时?

为什么参数包扩展与不同的C ++编译器有不同的工作原理?

参数包扩展由VS2015编译器反转。 我有以下代码: #include <iostream> #include <vector> template <typename… T> void f_Swallow(T &&…) { } template <typename… T> std::vector<int> f(T …arg) { std::vector<int> result; f_Swallow ( [&]() { result.push_back(arg); return true; } ()… ) ; return result; } using namespace std; int main() { auto vec = f(1,2,3,4); for (size_t i = 0; i < vec.size(); […]

C ++视图types:通过const&或通过值?

这是最近在代码审查讨论中提出的,但没有得到令人满意的结论。 所讨论的types与C ++ string_view TS类似。 他们是简单的非拥有包装指针和长度,用一些自定义函数装饰: #include <cstddef> class foo_view { public: foo_view(const char* data, std::size_t len) : _data(data) , _len(len) { } // member functions related to viewing the 'foo' pointed to by '_data'. private: const char* _data; std::size_t _len; }; 问题出现在于是否有一个参数可以通过值或const引用传递这种视图types(包括即将到来的string_view和array_viewtypes)。 赞成按值传递的论据等于“较less打字”,“如果视图具有有意义的突变,则可以突变本地副本”,以及“可能效率不高”。 支持传递const引用的论据相当于“更习惯于通过const&传递对象”和“可能效率不高”。 是否有任何额外的考虑可能以某种方式决定性地摆动论点,或者根据价值或常量引用来传递惯用视图types。 对于这个问题,假定C ++ 11或C ++ 14语义以及足够现代的工具链和目标体系结构是安全的。

根据标准委员会的说法,为什么匿名命名空间不能代替命名空间静态?

根据这个答案 ,命名空间范围的静态variables在C ++ 11中是不赞成的。 也就是说,它们在C ++ 03中被弃用,因为匿名的命名空间被认为是更好的。 但是C ++ 11不推荐使用它们。 为什么? N3296列举了这个推理 : 命名空间范围内的静态使用不应该被弃用。 匿名命名空间不足以取代function。 这显然是委员会接受的。 为什么? 什么是匿名命名空间不完全取代这个function? 我更喜欢有一些文件或标准委员会讨论文件的答案。