Questions tagged «c++11»

将此标记用于必须作为C ++ 11编译的代码(不使用C ++ 14或更高版本中引入的任何功能)。

5
使用外部模板(C ++ 11)
图1:功能模板 TemplHeader.h template<typename T> void f(); TemplCpp.cpp template<typename T> void f(){ //... } //explicit instantation template void f<T>(); Main.cpp #include "TemplHeader.h" extern template void f<T>(); //is this correct? int main() { f<char>(); return 0; } 这是正确的使用方法extern template,还是仅将关键字用于类模板,如图2所示? 图2:类模板 TemplHeader.h template<typename T> class foo { T f(); }; TemplCpp.cpp template<typename T> …
116 c++  templates  c++11  extern 

4
避免在for循环中使用if语句?
我有一个叫做的类Writer,它具有如下功能writeVector: void Drawer::writeVector(vector<T> vec, bool index=true) { for (unsigned int i = 0; i < vec.size(); i++) { if (index) { cout << i << "\t"; } cout << vec[i] << "\n"; } } 我正在尝试没有重复的代码,同时仍然担心性能。在函数中,即使结果始终相同if (index),我for也会在-loop的每一轮中进行检查。这与“担心性能”相反。 通过将检查放在我的for-loop 之外,可以轻松避免这种情况。但是,我将获得大量重复代码: void Drawer::writeVector(...) { if (index) { for (...) { cout << i …



3
在基于范围的for循环中使用转发引用有什么好处?
const auto&如果我要执行只读操作就足够了。但是,我碰到了 for (auto&& e : v) // v is non-const 最近几次。这让我感到奇怪: 与auto&或相比,在某些晦涩难懂的情况下使用转发引用是否有一些性能优势const auto&? (shared_ptr疑似死角案件) 更新 在我的收藏夹中找到的两个示例: 遍历基本类型时使用const引用有什么缺点吗? 我可以使用基于范围的for循环轻松地迭代地图的值吗? 请集中讨论以下问题:为什么我要在基于范围的for循环中使用auto &&?

2
C ++标准委员会打算在C ++ 11中unordered_map销毁它插入的内容吗?
我刚刚度过了三天的时间,一直在寻找一个非常奇怪的错误,在这个错误中unordered_map :: insert()破坏了您插入的变量。这种高度非显而易见的行为仅发生在最近的编译器中:我发现clang 3.2-3.4和GCC 4.8是唯一展示此“功能”的编译器。 这是我的主要代码库中的一些简化代码,可以说明该问题: #include <memory> #include <unordered_map> #include <iostream> int main(void) { std::unordered_map<int, std::shared_ptr<int>> map; auto a(std::make_pair(5, std::make_shared<int>(5))); std::cout << "a.second is " << a.second.get() << std::endl; map.insert(a); // Note we are NOT doing insert(std::move(a)) std::cout << "a.second is now " << a.second.get() << std::endl; return 0; …
114 c++  gcc  c++11  clang  standards 

1
如何对可变参数函数中的所有参数调用std :: forward?
我只是在编写一个通用对象工厂,并使用boost预处理器元库制作一个可变参数模板(使用2010,但它不支持它们)。我的函数使用rval引用并std::forward进行完美的转发,这让我开始想...当C ++ 0X出现并且我有一个标准的编译器时,我将使用真实的可变参数模板进行此操作。不过,我std::forward该如何谈谈? template <typename ...Params> void f(Params... params) // how do I say these are rvalue reference? { y(std::forward(...params)); //? - I doubt this would work. } 我能想到的唯一方法是需要手动解压缩... params,而且我也还没有。有没有一种更快的语法可以工作?


9
同时迭代两个或多个容器的最佳方法是什么
C ++ 11提供了多种遍历容器的方式。例如: 基于范围的循环 for(auto c : container) fun(c) std :: for_each for_each(container.begin(),container.end(),fun) 但是,建议对两个(或更多个)相同大小的容器进行迭代以完成类似任务的方法是: for(unsigned i = 0; i < containerA.size(); ++i) { containerA[i] = containerB[i]; }

6
为什么我们可以在const对象上使用std :: move?
在C ++ 11中,我们可以编写以下代码: struct Cat { Cat(){} }; const Cat cat; std::move(cat); //this is valid in C++11 当我调用时std::move,表示我想移动对象,即我将更改对象。移动const对象是不合理的,那么为什么不std::move限制这种行为呢?将来会成为陷阱,对吗? 陷阱的含义如布兰登在评论中所述: “我认为他的意思是它“诱捕”他偷偷摸摸的偷偷摸摸,因为如果他不知道,他最终会得到一份不是他想要的副本。” 在斯科特·迈耶斯(Scott Meyers)的著作《有效的现代C ++》中,他举了一个例子: class Annotation { public: explicit Annotation(const std::string text) : value(std::move(text)) //here we want to call string(string&&), //but because text is const, //the return type of std::move(text) is …
113 c++  c++11 

4
cout是否同步/线程安全?
通常,我假定流不同步,这取决于用户进行适当的锁定。但是,诸如此类的事情cout在标准库中得到特殊对待吗? 也就是说,如果正在写入多个线程,它们是否cout可以破坏cout对象?我了解,即使同步,您仍然会获得随机交错的输出,但是可以保证交错。也就是说,cout从多个线程使用安全吗? 该供应商依赖吗?gcc是做什么的? 重要提示:如果您回答“是”,请提供某种参考,因为我需要某种证明。 我也不在乎底层的系统调用,这些很好,但是流在顶部增加了一层缓冲。
112 c++  gcc  c++11 

20
您如何遍历std :: tuple的元素?
我如何遍历一个元组(使用C ++ 11)?我尝试了以下方法: for(int i=0; i<std::tuple_size<T...>::value; ++i) std::get<i>(my_tuple).do_sth(); 但这不起作用: 错误1:抱歉,未实现:无法将“侦听器...”扩展为固定长度的参数列表。 错误2:我无法出现在常量表达式中。 那么,如何正确遍历元组的元素?

8
如何简洁,可移植和彻底播种mt19937 PRNG?
我似乎看到了许多答案,有人建议使用这些答案<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。它至少有16位,可能是32位。这不足以使MT的19937位状态成为种子。 使用std::mt19937 gen(rd());gen()(用32位播种并查看第一个输出)不能提供良好的输出分布。7和13永远不会是第一个输出。两颗种子产生0。十二颗种子产生1226181350。(链接) std::random_device可以并且有时被实现为带有固定种子的简单PRNG。因此,每次运行可能会产生相同的序列。(链接)甚至比time(NULL)。 更糟糕的是,尽管存在上述问题,但复制并粘贴上述代码片段非常容易。为此,一些解决方案需要获取可能并不适合每个人的大型 库。 有鉴于此,我的问题是,如何能以C ++简洁,可移植,彻底地植入mt19937 PRNG? 鉴于上述问题,一个好的答案是: 必须完全植入mt19937 / mt19937_64。 不能完全依赖std::random_device或time(NULL)作为熵的来源。 不应该依赖Boost或其他库。 应该放在少量的行中,这样看起来很不错,可以粘贴到答案中。 思想 我目前的想法是,std::random_device可以使用time(NULL),从地址空间随机化派生的值和硬编码的常数(可以在分发期间设置)将的输出(可以通过XOR)进行混搭,以尽力而为。 std::random_device::entropy() 不能很好地说明std::random_device可能做什么或可能不会做什么。
112 c++  c++11  random 

4
枚举类可以转换为基础类型吗?
有没有一种方法可以将enum class字段转换为基础类型?我认为这将是自动的,但显然不是。 enum class my_fields : unsigned { field = 1 }; unsigned a = my_fields::field; 该作业已被GCC拒绝。error: cannot convert 'my_fields' to 'unsigned int' in assignment。
112 c++  c++11 

13
如何使用C ++避免内部带有“ if”条件的“ for”循环?
用我编写的几乎所有代码,我经常要处理集合的集合约简问题,这些集合最终会在集合内部出现幼稚的“ if”条件。这是一个简单的例子: for(int i=0; i<myCollection.size(); i++) { if (myCollection[i] == SOMETHING) { DoStuff(); } } 使用函数式语言,我可以通过轻松地将集合简化为另一个集合来解决问题,然后对我的简化集合执行所有操作。用伪代码: newCollection <- myCollection where <x=true map DoStuff newCollection 在其他C变体中,例如C#,我可以使用where子句来简化 foreach (var x in myCollection.Where(c=> c == SOMETHING)) { DoStuff(); } 或者更好(至少在我看来) myCollection.Where(c=>c == Something).ToList().ForEach(d=> DoStuff(d)); 诚然,我正在做很多范式混合和基于主观/观点的风格,但是我不禁感到缺少真正的基础知识,可以让我将这种首选技术与C ++一起使用。有人可以启发我吗?
111 c++  c++11  c++14 

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.