Questions tagged «c++11»

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


4
std :: function如何实现?
根据我发现的消息来源,lambda表达式实际上是由编译器实现的,该编译器创建了一个带有重载函数调用运算符并将引用变量作为成员的类。这表明lambda表达式的大小是变化的,并且给定足够多的引用变量,大小可能会任意大。 的大小std::function应为固定,但必须能够包装任何类型的可调用对象,包括任何同类型的lambda。如何实施?如果std::function内部使用指向其目标的指针,那么在std::function复制或移动实例时会发生什么?是否涉及任何堆分配?
99 c++  c++11  lambda 

4
我们为什么要复制然后移动?
我在某处看到的代码中有人决定复制一个对象,然后将其移动到类的数据成员中。这让我感到困惑,因为我认为移动的全部目的是避免复制。这是示例: struct S { S(std::string str) : data(std::move(str)) {} }; 这是我的问题: 为什么我们不采用右值引用str? 一份副本会不会很贵,特别是给类似的东西std::string吗? 作者决定复制然后搬家的原因是什么? 我什么时候应该自己做?

2
在可变参数模板的上下文中,“…”令牌的规则是什么?
在C ++ 11中,有这样的可变参数模板: template< class T, class... Args > unique_ptr<T> make_unique( Args&&... args ) { return unique_ptr<T>(new T(std::forward<Args>(args)...)); } 对此有一些好奇:表达式同时std::forward<Args>(args)...使用Args且args仅使用一个...标记。此外,还有std::forward一种仅采用一个模板参数和一个自变量的非可变模板函数。(大致)有什么语法规则?如何将其概括? 另外:在函数实现中,省略号(...)位于关注表达式的末尾。是否有原因在模板参数列表和参数列表中省略号位于中间?

6
在构造函数初始值设定项中初始化成员数组
class C { public: C() : arr({1,2,3}) //doesn't compile {} /* C() : arr{1,2,3} //doesn't compile either {} */ private: int arr[3]; }; 我相信原因是只能使用=语法来初始化数组,即: int arr[3] = {1,3,4}; 问题 我该怎么做我想做的事情(就是在构造函数中初始化一个数组(而不是在主体中分配元素))。可能吗? C ++ 03标准是否对在ctor初始化程序中初始化聚合(包括数组)有什么特别的建议?还是上述代码的无效性是其他某些规则的必然结果? C ++ 0x初始化程序列表可以解决问题吗? PS:请不要提及向量,boost :: arrays及其对数组的优越性,我很清楚。

13
C ++ 11的Sequence-zip函数?
使用新的基于范围的for循环,我们可以编写如下代码 for(auto x: Y) {} 哪个IMO是(例如)的巨大改进 for(std::vector<int>::iterator x=Y.begin(); x!=Y.end(); ++x) {} 它可以用来像Pythons zip函数那样循环两个同时循环吗?对于不熟悉Python的人,代码: Y1 = [1,2,3] Y2 = [4,5,6,7] for x1,x2 in zip(Y1,Y2): print x1,x2 作为输出 (1,4) (2,5) (3,6)
98 c++  c++11  sequences 

4
通过“ tuple”和“ tie”实现比较运算符,好主意吗?
(注:tuple和tie可以从升压或C ++ 11获得。) 当只有两个元素编写小结构,我有时往往选择std::pair,因为所有重要的东西是该数据类型已经完成,像operator<严格弱排序。 缺点是几乎没有用的变量名。即使我自己创建了那个typedef,也不会在两天后记住确切的first含义second,尤其是当它们属于同一类型时。对于两个以上的成员,情况变得更糟,因为嵌套pair非常糟糕。 另一个选择是tuple,无论是Boost还是C ++ 11,但看起来并没有更好和更清晰。因此,我自己开始编写结构,包括所有需要的比较运算符。 由于特别operator<麻烦,我想到了仅依靠为定义的操作来规避整个混乱tuple: 的示例operator<,例如用于严格弱排序: bool operator<(MyStruct const& lhs, MyStruct const& rhs){ return std::tie(lhs.one_member, lhs.another, lhs.yet_more) < std::tie(rhs.one_member, rhs.another, rhs.yet_more); } (从传递的参数中引用tie一个。) tupleT& 编辑:从@DeadMG私下继承的建议tuple不是一个坏建议,但是它有很多缺点: 如果操作员是独立的(可能是朋友),我需要公开继承 通过强制转换,operator=可以轻松绕过我的函数/运算符(特别是) 有了tie解决方案,我可以省去某些成员,如果他们对订购无所谓 我需要考虑此实现中的任何缺点吗?

12
从向量中删除项目,而在C ++ 11范围“ for”循环中?
我有一个IInventory *的向量,并且正在使用C ++ 11范围遍历该列表,以便对每个对象进行处理。 在处理完一个东西之后,我可能想将其从列表中删除并删除该对象。我知道我可以随时调用delete指针进行清理,但是在范围for循环中将其从向量中删除的正确方法是什么?如果我从列表中删除它,我的循环是否将无效? std::vector<IInventory*> inv; inv.push_back(new Foo()); inv.push_back(new Bar()); for (IInventory* index : inv) { // Do some stuff // OK, I decided I need to remove this object from 'inv'... }
97 c++  vector  for-loop  c++11 

4
std :: system_clock和std :: steady_clock之间的区别?
std::system_clock和之间有什么区别std::steady_clock?(一个示例示例说明不同的结果/行为将是很好的)。 如果我的目标是精确测量函数的执行时间(如基准),那么std::system_clock,std::steady_clock和之间的最佳选择是std::high_resolution_clock什么?
97 c++  c++11  timer  chrono 

8
initializer_list并移动语义
我可以将元素移出std::initializer_list<T>吗? #include <initializer_list> #include <utility> template<typename T> void foo(std::initializer_list<T> list) { for (auto it = list.begin(); it != list.end(); ++it) { bar(std::move(*it)); // kosher? } } 由于std::intializer_list<T>需要特别注意编译器并且没有像C ++标准库的普通容器那样的值语义,因此,我宁愿安全而不愿后悔。

6
将未知大小的std :: array传递给函数
在C ++ 11中,我将如何编写采用已知类型但大小未知的std :: array的函数(或方法)? // made up example void mulArray(std::array<int, ?>& arr, const int multiplier) { for(auto& e : arr) { e *= multiplier; } } // lets imagine these being full of numbers std::array<int, 17> arr1; std::array<int, 6> arr2; std::array<int, 95> arr3; mulArray(arr1, 3); mulArray(arr2, 5); mulArray(arr3, 2); …
97 c++  c++11  stdarray 

3
链接C ++ 17,C ++ 14和C ++ 11对象是否安全
假设我有三个编译对象,它们都是由同一编译器/版本生成的: A是使用C ++ 11标准编译的 B用C ++ 14标准编译 C用C ++ 17标准编译 为简单起见,我们假设所有标头均使用 C ++ 11编写,仅使用其语义在所有三个标准版本之间均未改变的构造,因此任何相互依赖关系都可以通过标头包含正确表达,并且编译器不反对。 这些对象是哪种组合,链接到单个二进制文件不安全吗?为什么? 编辑:涵盖主要编译器(例如gcc,clang,vs ++)的答案是受欢迎的
97 c++  c++11  linker  c++14  abi 


3
为什么没有std :: stou?
C ++ 11添加了一些新的字符串转换功能: http://en.cppreference.com/w/cpp/string/basic_string/stoul 它包括stoi(字符串到int),stol(字符串到long),stoll(字符串到long long),stoul(字符串到unsigned long),stoull(字符串到unsigned long long)。在没有stou(字符串到无符号)的情况下值得注意。是否有某些原因是不需要的,但所有其他原因都是? 相关:C ++ 11中没有“ sto {short,unsigned short}”函数吗?
96 c++  string  c++11  std 

1
使用委托构造函数进行成员初始化
我已经开始尝试C ++ 11标准,我发现了这个问题,该问题描述了如何从同一类中的另一个ctor调用您的ctor,以避免使用init方法或类似方法。现在,我正在尝试使用类似如下的代码进行相同的操作: hpp: class Tokenizer { public: Tokenizer(); Tokenizer(std::stringstream *lines); virtual ~Tokenizer() {}; private: std::stringstream *lines; }; cpp: Tokenizer::Tokenizer() : expected('=') { } Tokenizer::Tokenizer(std::stringstream *lines) : Tokenizer(), lines(lines) { } 但这给了我错误: In constructor ‘config::Tokenizer::Tokenizer(std::stringstream*)’: /path/Tokenizer.cpp:14:20: error: mem-initializer for ‘config::Tokenizer::lines’ follows constructor delegation我尝试将Tokenizer()部分移到列表的第一和最后,但这无济于事。 这背后的原因是什么,我应该如何解决?我试着lines(lines)用this->lines = lines;代替将其移动到身体,并且效果很好。但是我真的很希望能够使用初始化列表。

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.