c++11相关内容
我理解 volatile 通知编译器该值可能会更改,但为了完成此功能,编译器是否需要引入内存栅栏工作? 从我的理解,对volatile对象的操作序列不能重新排序,必须保留。这似乎暗示一些记忆栅栏是必要的,并没有真正的方法围绕这一点。 这个相关问题 David Schwartz 回复 ...没有区别, C ++标准的观点, 在编译器做某事之间,编译器发出 指令,使硬件做某
..
我正在阅读有关“规则五”的不错答案,我注意到了我不记得以前看过了: class C { ... C& operator =(const C&)& =默认; C& operator =(C&& amp;)& =默认; ... }; & 字符放置在 = default 前面的复制赋值操作符和移动赋值操作符? 解决方案 这是一个允许C ++ 11非静
..
每个标准容器都有一个 begin 和 end 函数,用于返回该容器的迭代器。但是,C ++ 11显然引入了一些免费函数,名为 begin 和 end 调用 begin 和 end 成员函数。所以,而不是写 auto i = v.begin(); auto e = v.end(); 您可以写 auto i = begin(v); auto e = end(
..
我在Mac OS X(10.8.2)中使用C ++,我最近想出了使用C ++ 11功能的需要,这些功能可以通过clang ++编译器使用libc ++ stdlib。 然而,我还需要使用一些遗留的库编译和链接到libstdc ++(来自MacPorts)。 这样做时,我发现链接错误,因为使用例如 std :: string ,需要根据 std :: __ 1 :: basic_string
..
可能重复: b $ b 我们(作为一个社群)有足够的经验来确定汽车何时和/或是否被滥用? 我是什么真正寻找 何时使用自动 避免 在80%的情况下可以快速遵循的简单的经验法则。 作为上下文,这个问题是由我的回应引发的这里 解决方案 我认为当类型在在您的项目中工作(或将工作)的程序员,则可以使用 auto ,例如以下代码: // good:auto这
..
我发现自己没有完全理解 std :: move()的逻辑。 首先,我尝试了它,但似乎只有文档关于如何使用 std :: move() 我的意思是,我知道模板成员函数是什么,但是当我看到 std :: move )在VS2010中的定义,它仍然令人困惑。 std :: move()的定义如下。 模板 inline typename tr1 :: _
..
C ++ 11 std :: move(x)函数根本不移动任何东西。它只是一个转换为r值。为什么这样做? c> std :: move(x) code>只是一个转换为右值 - 更具体地说,是 xvalue ,而不是 prvalue 。还有一个事实,有一个名为 move 的演员有时会让人困惑。 move 可追溯至 2002年的原移动提案。本文首先介绍右值引用,然后说明如何编写更有效的 std
..
当 {0} 用于在C ++中初始化对象时,是什么意思?我在任何地方找不到对 {0} 的任何引用,并且因为大括号谷歌搜索没有帮助。 示例代码: SHELLEXECUTEINFO sexi = {0}; sexi.cbSize = sizeof(SHELLEXECUTEINFO); sexi.hwnd = NULL; sexi.fMask = SEE_MASK_NOCLOSE
..
句柄 具有除指针之外的适当语义。所以对我来说这样一个例子(摘自 规则of ): 类模块{ public: explicit模块(std :: wstring const& name) :handle {:: LoadLibrary(name.c_str()),& :: FreeLibrary} {} //其他模块相关函数go here private: using mo
..
我想知道为什么要使用 priority_queue 创建一个最小堆,应该使用 std :: greater ? std :: priority_queue,std :: greater& > min_heap; 对我来说,由于最小的值总是位于堆的顶部, std :: less 更新: 另一方面,因为 prior
..
我想要使用boost :: asio并尝试编译以下代码: std :: unique_ptr buffer = buffers.pop(); std :: function t = std :: bind(& tcp_client :: handle_read_
..
在C ++ 11中,我使用constexpr函数作为模板参数的默认值 - 它如下所示: template struct bar { static constexpr int get() { return value; } }; template struct foo
..
当我运行此代码: struct X { int a; }; struct Y:public X {}; X x = {0}; Y Y = {0}; 我得到: 错误:无法将“{0}”从“'转换为”Y“ 为什么大括号初始化对基类而不是派生类有效? 解决方案您的问题与聚合初始化有关: struct X
..
我有一个变量声明为: 枚举类FooEnum:uint64_t {} ,我想转换为其基本类型,但我不想硬编码基本类型。例如,像这样: FooEnum myEnum; uint64_t * intPointer =(underlying_typeof(myEnum))& myEnum; 这是否可能? 方案 您可以使用:
..
尝试编译以下代码: #include #include struct Foo { Foo(){std :: cout
..
我试图使用 std :: function 和 std :: bind ,但我' m有一些问题。 这样做: #include< ;功能> #include void print(){ std :: cout foo = print; (* foo
..
我正在阅读名为由Leor Zolman先生介绍的C ++ 11和C ++ 14概述。在第35页,他介绍了一种使用 decltype 进行求和运算的方法。 struct Sum { template static T sum(T n){ return n; } template ///
..
我试图使用C ++ 11的正则表达式,但失败,甚至在一个小例子。从外部,似乎只比较字符串,例如: std :: regex_match(std :: string {“ “},std :: regex {”a?“})// false(???) std :: regex_match(std :: string {”a?“},std :: regex { “})// true(???)
..
是否向左移动一个否定 int 在C ++ 11中未定义的行为? 这里是从5.8: 2 / E1的值位为零填充。如果E1具有无符号类型, 结果的值为E1×2E2,比在结果类型中可表示的最大值 减1。否则,如果E1具有签名类型 和非负值,并且E1×2E2可以在结果 类型中表示,那么这是结果值; 令我困惑的部分是: $否则,如果E1具有有符号类型和非负值,并且E1×2E2
..
例如,这无法编译: std :: function my_printf(printf); 使用gcc时,错误消息如下: 错误:variable'std :: function my_printf'具有初始化器但不完整的类型 std :: function
..