Tag: c ++ 11

为什么C ++ 11中的类初始化程序不能使用括号?

例如,我不能写这个: class A { vector<int> v(12, 1); }; 我只能写这个: class A { vector<int> v1{ 12, 1 }; vector<int> v2 = vector<int>(12, 1); }; C ++ 11语言devise的区别是什么?

捕获的C ++ lambda作为函数指针

我正在玩C ++ lambda和他们隐式转换为函数指针。 我的起始示例是使用它们作为ftw函数的callback函数。 这按预期工作。 #include <ftw.h> #include <iostream> using namespace std; int main() { auto callback = [](const char *fpath, const struct stat *sb, int typeflag) -> int { cout << fpath << endl; return 0; }; int ret = ftw("/etc", callback, 1); return ret; } 修改后使用捕获: int main() { vector<string> entries; auto callback […]

通过“tuple”和“tie”来实现比较运算符,这是一个好主意吗?

(注: tuple和tie可以从Boost或C ++ 11中取得) 在编写只有两个元素的小型结构时,我有时会倾向于select一个std::pair ,因为所有重要的东西都已经为该数据types完成了,比如operator< for strict-weak-ordering。 缺点虽然是几乎没用的variables名称。 即使我自己创build了typedef ,两天之后我也不会记得first和second是什么,特别是如果它们是同一types的话。 这对于两个以上的成员来说更糟,因为嵌套pair非常糟糕。 另一种select是从Boost或C ++ 11中得到一个tuple ,但是看起来并没有更好更清晰。 所以我回到自己编写结构,包括任何需要的比较运算符。 由于特别是operator<可能相当麻烦,所以我想通过仅仅依赖于为tuple定义的操作来规避这个混乱: operator<例如严格弱sorting的例子: 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从所传递的参数构成T&引用。) 编辑 :从@DeadMG私人从tupleinheritance的build议不是一个坏的,但它有一些缺点: 如果运营商是独立的(可能是朋友),我需要公开inheritance 通过投射,我的function/操作员(特别是operator= )可以轻松绕过 有了这个tie解决scheme,如果他们对订购无关紧要,我可以省略某些成员 这个实现有什么缺点,我需要考虑吗?

序列zipfunction的C + + 11?

使用新的基于范围的for循环,我们可以编写类似的代码 for(auto x: Y) {} 哪个国际海事组织是一个巨大的改进(例如) 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)

可变模板包扩展

我正在尝试学习可变参数模板和函数。 我不明白为什么这个代码不能编译: template<typename T> static void bar(T t) {} template<typename… Args> static void foo2(Args… args) { (bar(args)…); } int main() { foo2(1, 2, 3, "3"); return 0; } 当我编译失败,错误: 错误C3520:“args”:参数包必须在此上下文中展开 (在函数foo2 )。

如何在只有protected或private构造函数的类上调用:: std :: make_shared?

我有这个代码不起作用,但我认为这个意图很明显: testmakeshared.cpp #include <memory> class A { public: static ::std::shared_ptr<A> create() { return ::std::make_shared<A>(); } protected: A() {} A(const A &) = delete; const A &operator =(const A &) = delete; }; ::std::shared_ptr<A> foo() { return A::create(); } 但是当我编译它时,我得到这个错误: g++ -std=c++0x -march=native -mtune=native -O3 -Wall testmakeshared.cpp In file included from /usr/lib/gcc/x86_64-redhat-linux/4.6.1/../../../../include/c++/4.6.1/bits/shared_ptr.h:52:0, from /usr/lib/gcc/x86_64-redhat-linux/4.6.1/../../../../include/c++/4.6.1/memory:86, from testmakeshared.cpp:1: […]

由右值引用返回更有效?

例如: Beta_ab&& Beta::toAB() const { return move(Beta_ab(1, 1)); }

C ++ 11 auto关键字多less钱?

我一直在C ++ 11标准中使用新的auto关键字,用于复杂的模板types,这是我相信它的目的。 但我也使用它的东西,如: auto foo = std::make_shared<Foo>(); 更怀疑的是: auto foo = bla(); // where bla() return a shared_ptr<Foo> 我没有看到有关这个话题的很多讨论。 看起来auto可能被过度使用,因为types通常是一种文件和健全性检查。 你在哪里画线使用auto和什么是这个新function的推荐用例? 澄清:我不是要求哲学观点, 我要求标准委员会对这个关键词进行预期的使用,可能会对实际中如何实现这个预期的使用做出评论。 附注:这个问题被转移到SE.Programmers,然后回到堆栈溢出。 关于这个的讨论可以在这个元问题中find。

为什么常量expression式有未定义行为的排除?

我正在研究核心常量expression式*中允许的内容, C ++标准草案第5.19节的常量expression式中包含了以下内容: 一个条件expression式是一个核心常量expression式,除非它涉及以下之一作为一个潜在的评估子expression式(3.2),但是没有被评估的逻辑AND(5.14),逻辑OR(5.15)和条件(5.16)操作的子expression式不考虑[注意:重载操作符调用一个函数。 并列出了下面的子弹中的排除项(包括我的重点 ): – 注意:例如,包括有符号整数溢出(第5章),某些指针算术(5.7),除以零(5.6)或某些移位操作(5.8) – 结束注释]。 呃 ? 为什么常量expression式需要这个子句来覆盖未定义的行为 ? 常量expression式有什么特别之处,需要不确定的行为才能排除在特殊情况之外呢? 这个条款有没有给我们带来任何好处或工具? 作为参考,这看起来像广义常量expression式的最后一个版本。

为什么这个C ++代码片段编译(非void函数不返回值)

我今天早上在我的一个图书馆里发现了这个: static tvec4 Min(const tvec4& a, const tvec4& b, tvec4& out) { tvec3::Min(a,b,out); out.w = min(aw,bw); } 我期望编译器错误,因为这个方法不返回任何东西,并且返回types不是void 。 想到的唯一的两件事是 在唯一调用此方法的地方,返回值未被使用或存储。 (这种方法应该是void – tvec4返回types是复制粘贴错误) 一个默认构build的tvec4正在创build,这似乎有点不像,哦,C ++中的其他一切。 我还没有find解决这个问题的C ++规范的一部分。 参考(公顷)表示赞赏。 更新 在某些情况下,这会在VS2012中产生一个错误。 我没有缩小细节,但是很有趣。