Questions tagged «c++11»

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

8
我什么时候应该真正使用noexcept?
该noexcept关键字可以适当地应用于许多功能签名,但我不能确定何时我应该考虑在实践中使用它。根据我到目前为止所读的内容,最后一刻添加noexcept似乎解决了移动构造函数抛出时出现的一些重要问题。但是,对于一些实际的问题,我仍然无法提供满意的答案,这些问题使我不得不首先阅读更多内容noexcept。 我知道有很多函数永远不会抛出的示例,但是编译器无法自行确定。noexcept在所有这种情况下,我都应该在函数声明后附加吗? 必须考虑noexcept在每个函数声明之后是否都需要追加操作,这将大大降低程序员的工作效率(坦率地说,这将是一件痛苦的事情)。在哪些情况下我应该更小心使用它noexcept,在哪些情况下我可以摆脱隐含的含义noexcept(false)? 使用后,我什么时候才能实际观察到性能改善noexcept?特别是,给出一个示例代码,在添加之后C ++编译器能够为其生成更好的机器代码noexcept。 我个人很在乎,noexcept因为为编译器提供了增加的自由度,可以安全地应用某些优化。现代编译器是否noexcept以此方式利用?如果没有,我可以指望其中的一些在不久的将来这样做吗?

6
使用std :: forward的主要目的是什么,它可以解决哪些问题?
在完善的转发,std::forward是用来转换指定的右值引用t1,并t2以不具名rvalue引用。这样做的目的是什么?inner如果我们将t1&保留t2为左值,对调用的函数有何影响? template <typename T1, typename T2> void outer(T1&& t1, T2&& t2) { inner(std::forward<T1>(t1), std::forward<T2>(t2)); }

6
C ++ 11右值和移动语义混淆(返回语句)
我试图理解右值引用并移动C ++ 11的语义。 这些示例之间有什么区别,哪些将不进行矢量复制? 第一个例子 std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return tmp; } std::vector<int> &&rval_ref = return_vector(); 第二个例子 std::vector<int>&& return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); } std::vector<int> &&rval_ref = return_vector(); 第三个例子 std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); } std::vector<int> &&rval_ref = return_vector();


6
如何将unique_ptr参数传递给构造函数或函数?
我是C ++ 11中移动语义的新手,而且我不太清楚如何处理unique_ptr构造函数或函数中的参数。考虑此类本身的引用: #include <memory> class Base { public: typedef unique_ptr<Base> UPtr; Base(){} Base(Base::UPtr n):next(std::move(n)){} virtual ~Base(){} void setNext(Base::UPtr n) { next = std::move(n); } protected : Base::UPtr next; }; 这是我应该编写带有unique_ptr参数的函数的方式吗? 我需要std::move在调用代码中使用吗? Base::UPtr b1; Base::UPtr b2(new Base()); b1->setNext(b2); //should I write b1->setNext(std::move(b2)); instead?


10
漂亮的C ++ STL容器
请注意这篇文章末尾的更新。 更新:我已经在GitHub上为此库创建了一个公共项目! 我希望有一个模板,该模板一劳永逸地负责通过漂亮地打印所有STL容器operator<<。用伪代码,我正在寻找这样的东西: template<container C, class T, String delim = ", ", String open = "[", String close = "]"> std::ostream & operator<<(std::ostream & o, const C<T> & x) { o << open; // for (typename C::const_iterator i = x.begin(); i != x.end(); i++) /* Old-school */ for (auto i …

9
什么是std :: promise?
我相当熟悉C ++ 11分的std::thread,std::async和std::future部件(例如见这个答案),这是直接的。 但是,我不太了解std::promise它的用途,作用以及在什么情况下最好使用它。标准文档本身不包含除类概述之外的大量信息,而且::: thread也不包含。 有人可以举一个简短,简洁的例子来说明这种情况的std::promise需要,它是最惯用的解决方案?

1
C ++模板typedef
我有一堂课 template<size_t N, size_t M> class Matrix { // .... }; 我想制作一个typedef创建一个Vector(列向量),它等效于一个Matrix大小为N和1的东西。 typedef Matrix<N,1> Vector<N>; 产生编译错误。以下创建类似的东西,但不完全是我想要的东西: template <size_t N> class Vector: public Matrix<N,1> { }; 是否有解决方案或不太昂贵的解决方法/最佳实践?
368 c++  templates  c++11  typedef 

5
从函数返回unique_ptr
unique_ptr<T>不允许复制构造,而是支持移动语义。但是,我可以unique_ptr<T>从函数返回a 并将返回的值分配给变量。 #include <iostream> #include <memory> using namespace std; unique_ptr<int> foo() { unique_ptr<int> p( new int(10) ); return p; // 1 //return move( p ); // 2 } int main() { unique_ptr<int> p = foo(); cout << *p << endl; return 0; } 上面的代码按预期进行编译和工作。那么,该行如何1不调用复制构造函数并导致编译器错误呢?如果我不得不使用line,2那将会很有意义(使用line 2也可以,但是我们不需要这样做)。 我知道C ++ 0x允许发生此异常,unique_ptr因为返回值是一个临时对象,一旦函数退出,该对象将被销毁,从而保证了返回指针的唯一性。我很好奇这是如何实现的,它是在编译器中进行特殊处理还是在该语言规范中使用了其他条款?
367 c++  c++11  unique-ptr 

5
用g ++编译C ++ 11
我正在尝试将我的C ++编译器更新为C ++ 11。经过一些搜索,得出的结论是我必须使用标志-std=c++0x或-std=gnu++0x,但是我对标志的了解不多。谁能帮我?(我正在使用Ubuntu 12.04。) 这是当我尝试使用C ++ 11中包含的库(即数组)时从编译器收到的错误: #include <array> #include <iostream> int main() { std::array<int, 3> arr = {2, 3, 5}; ... } 该文件需要编译器和库支持即将推出的ISO C ++标准C ++ 0x。该支持目前处于试验阶段,必须使用-std = c ++ 0x或-std = gnu ++ 0x编译器选项启用。
367 c++  c++11  g++  flags 

14
如何在CMake中激活C ++ 11?
当我尝试运行CMake生成的makefile来编译程序时,出现以下错误: C ++ 98模式不支持基于范围的循环。 我尝试添加add_definitions(-std=c++0x)到CMakeLists.txt,但没有帮助。 我也尝试过这个: if(CMAKE_COMPILER_IS_GNUCXX) add_definitions(-std=gnu++0x) endif() 当我这样做时g++ --version,我得到: g ++(Ubuntu / Linaro 4.6.1-9ubuntu3)4.6.1 我也尝试过SET(CMAKE_CXX_FLAGS "-std=c++0x"),这也行不通。 我不明白如何使用CMake激活C ++ 11功能。
356 c++11  cmake 

6
std :: unique_lock <std :: mutex>或std :: lock_guard <std :: mutex>?
Наэтотвопросестьответына 堆栈溢出нарусском:Чем的std :: unique_lockотличаетсяот的std :: lock_guard? 我有两个用例。 答:我想通过两个线程同步对队列的访问。 B.我想同步两个线程对队列的访问并使用条件变量,因为一个线程将等待内容被另一个线程存储到队列中。 对于用例AI,请参见使用的代码示例std::lock_guard&lt;&gt;。有关用例BI,请参见使用的代码示例std::unique_lock&lt;&gt;。 两者之间有什么区别?在哪种用例中应该使用哪一种?

14
什么时候应该在C ++ 11中使用constexpr功能?
在我看来,拥有“总是返回5的函数”正在破坏或削弱“调用函数”的含义。一定有原因或需要此功能,否则C ++ 11中不会存在。为什么在那儿? // preprocessor. #define MEANING_OF_LIFE 42 // constants: const int MeaningOfLife = 42; // constexpr-function: constexpr int MeaningOfLife () { return 42; } 在我看来,如果我编写了一个返回文字值的函数,并且进行了代码审查,则有人会告诉我,我应该声明一个常量值,而不是编写return 5。
337 c++  c++11  constexpr 

5
如何在std :: map中使用基于范围的for()循环?
C ++ 11基于范围的for()循环的常见示例总是像这样简单: std::vector&lt;int&gt; numbers = { 1, 2, 3, 4, 5, 6, 7 }; for ( auto xyz : numbers ) { std::cout &lt;&lt; xyz &lt;&lt; std::endl; } 在这种情况下xyz是int。但是,当我们有地图时会发生什么?在此示例中,变量的类型是什么: std::map&lt; foo, bar &gt; testing = { /*...blah...*/ }; for ( auto abc : testing ) { std::cout &lt;&lt; abc …

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.