Questions tagged «c++11»

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


2
C ++ 11 Lambda实现和内存模型
我想要一些有关如何正确考虑C ++ 11闭包以及std::function如何实现它们和如何处理内存的信息。 尽管我不相信过早的优化,但我确实有习惯在编写新代码时仔细考虑选择的性能影响。我还进行了大量的实时编程,例如在微控制器和音频系统上,以避免不确定的内存分配/重新分配暂停。 因此,我想更好地理解何时使用或不使用C ++ lambda。 我目前的理解是没有捕获的闭包的lambda就像C回调一样。但是,当通过值或引用捕获环境时,将在堆栈上创建一个匿名对象。当必须从函数返回值闭包时,将其包装在中std::function。在这种情况下,关闭内存会发生什么?它是从堆栈复制到堆吗?每当释放时,std::function就释放它std::shared_ptr吗,也就是说,它是否像引用一样计数? 我想象在一个实时系统中,我可以建立一个lambda函数链,将B作为连续参数传递给A,从而A->B创建处理管道。在这种情况下,A和B闭包将分配一次。虽然我不确定是将它们分配在堆栈还是堆上。但是总的来说,在实时系统中使用它似乎是安全的。另一方面,如果B构造了一些返回的lambda函数C,则C的内存将被重复分配和释放,这对于实时使用是不可接受的。 用伪代码,一个DSP循环,我认为它将是实时安全的。我要执行处理块A,然后执行B,其中A调用其参数。这两个函数都返回std::function对象,因此f将是一个std::function对象,其环境存储在堆中: auto f = A(B); // A returns a function which calls B // Memory for the function returned by A is on the heap? // Note that A and B may maintain a state // via mutable value-closure! for (t=0; …
92 c++  memory  lambda  c++11 

8
为什么预处理器宏是邪恶的,还有哪些替代方法?
我一直问这个问题,但是我从来没有收到一个很好的答案。我认为几乎所有程序员甚至在编写第一个“ Hello World”之前都遇到过诸如“永远不应该使用宏”,“宏是邪恶的”之类的短语,我的问题是:为什么?这么多年后,有了新的C ++ 11,还有真正的替代选择吗? 最简单的部分是关于#pragma特定于平台和编译器的宏,例如,它们在大多数情况下都具有严重缺陷,例如#pragma once在至少两种重要情况下容易出错:在不同路径中具有相同名称,并且在某些网络设置和文件系统中。 但是总的来说,宏及其用法的替代方案又如何呢?

6
错误:: make_unique不是'std'的成员
我正在尝试编译代码审查中发布的以下线程池程序以对其进行测试。 /codereview/55100/platform-independant-thread-pool-v4 但是我得到了错误 threadpool.hpp: In member function ‘std::future<decltype (task((forward<Args>)(args)...))> threadpool::enqueue_task(Func&&, Args&& ...)’: threadpool.hpp:94:28: error: ‘make_unique’ was not declared in this scope auto package_ptr = make_unique<task_package_impl<R, decltype(bound_task)>> (std::move(bound_task), std::move(promise)); ^ threadpool.hpp:94:81: error: expected primary-expression before ‘>’ token auto package_ptr = make_unique<task_package_impl<R, decltype(bound_task)>>(std::move(bound_task), std::move(promise)); ^ main.cpp: In function ‘int main()’: main.cpp:9:17: error: …

4
尾随返回类型的语法样式是否应该成为新的C ++ 11程序的默认样式?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 3年前关闭。 改善这个问题 C ++ 11支持新的函数语法: auto func_name(int x, int y) -> int; 当前,此函数将声明为: int func_name(int x, int y); 新样式似乎尚未被广泛采用(例如在gcc stl中) 但是,这种新样式是否应该在新的C ++ 11程序中到处都是首选,还是仅在需要时使用? 就个人而言,我尽可能地选择旧样式,但是混合样式的代码库看起来很难看。

3
Constexpr与宏
我应该在哪里使用宏,哪里应该使用constexpr?它们不是基本相同吗? #define MAX_HEIGHT 720 与 constexpr unsigned int max_height = 720;
92 c++  c++11  macros  constexpr 

2
除运算符优先级外,什么时候附加括号什么时候起作用?
C ++中的括号在许多地方使用:例如,在函数调用和分组表达式中,以覆盖运算符优先级。除了非法的多余括号(例如在函数调用参数列表周围)之外,C ++的一个通用而非绝对规则是,多余的括号永远不会损害: 5.1主表达式[expr.prim] 5.1.1常规[expr.prim.general] 6带括号的表达式是一个主表达式,其类型和值与附带的表达式相同。括号的存在不影响表达式是否为左值。除非另有说明,否则带括号的表达式可以在与可以使用封闭表达式的上下文完全相同的上下文中使用,并且具有相同的含义。 问题:除了覆盖基本的运算符优先级以外,多余的括号还会在哪些上下文中更改C ++程序的含义? 注意:我认为指针到成员语法的限制(&qualified-id不带括号)不在范围内,因为它限制了语法,而不是允许两种具有不同含义的语法。同样,在预处理程序宏定义中使用括号也可以防止不必要的运算符优先级。

3
Lambda的显式返回类型
当我尝试编译此代码(VS2010)时,出现以下错误: error C3499: a lambda that has been specified to have a void return type cannot return a value void DataFile::removeComments() { string::const_iterator start, end; boost::regex expression("^\\s?#"); boost::match_results<std::string::const_iterator> what; boost::match_flag_type flags = boost::match_default; // Look for lines that either start with a hash (#) // or have nothing but white-space …

3
向量增长时如何执行移动语义?
我有std::vector某类的东西A。该类很简单,并定义了复制构造函数和 move构造函数。 std::vector<A> myvec; 如果我用A对象填充矢量(例如使用myvec.push_back(a)),则矢量的大小将增大,使用复制构造函数A( const A&)实例化矢量中元素的新副本。 我能以某种方式强制A使用class的move构造函数代替beging吗?

2
为什么不能在lambda中捕获此按引用('&this')?
我了解this在lambda中捕获(修改对象属性)的正确方法如下: auto f = [this] () { /* ... */ }; 但我对我所看到的以下特性感到好奇: class C { public: void foo() { // auto f = [] () { // this not captured auto f = [&] () { // why does this work? // auto f = [&this] () { // Expected …
91 c++  c++11  lambda 


4
cc1plus:错误:g ++无法识别的命令行选项“ -std = c ++ 11”
我正在尝试使用g++和编译-std=c++11或c++0x标志。 但是,我得到这个错误 cc1plus: error: unrecognized command line option "-std=c++11" g ++ --version g++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54) Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

2
使用非静态数据成员的类内初始化和嵌套类构造函数时出错
以下代码非常简单,我希望它可以编译良好。 struct A { struct B { int i = 0; }; B b; A(const B& _b = B()) : b(_b) {} }; 我已经使用g ++ 4.7.2、4.8.1,clang ++ 3.2和3.3测试了此代码。除了此代码的g ++ 4.7.2 segfaults(http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57770)之外,其他经过测试的编译器给出的错误消息也没有太多解释。 g ++ 4.8.1: test.cpp: In constructor ‘constexpr A::B::B()’: test.cpp:3:12: error: constructor required before non-static data member for ‘A::B::i’ has …

5
为什么lambda的大小为1个字节?
我正在使用C ++中的一些lambda进行内存存储,但是我对它们的大小有些不解。 这是我的测试代码: #include <iostream> #include <string> int main() { auto f = [](){ return 17; }; std::cout << f() << std::endl; std::cout << &f << std::endl; std::cout << sizeof(f) << std::endl; } 您可以在此处运行它:http : //fiddle.jyt.io/github/b13f682d1237eb69ebdc60728bb52598 输出是: 17 0x7d90ba8f626f 1 这表明我的λ大小为1。 这怎么可能? lambda至少不应该是其实现的指针吗?
89 c++  c++11  lambda  c++14  sizeof 

3
如何在C ++中制作条件typedef
我正在尝试做这样的事情: #include <iostream> #include <random> typedef int Integer; #if sizeof(Integer) <= 4 typedef std::mt19937 Engine; #else typedef std::mt19937_64 Engine; #endif int main() { std::cout << sizeof(Integer) << std::endl; return 0; } 但是我得到这个错误: error: missing binary operator before token "(" 我该如何正确地设置条件typedef?
89 c++  c++11 

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.