Questions tagged «c++11»

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

7
如何在C ++ 11中输出枚举类的值
如何enum class在C ++ 11中输出an的值?在C ++ 03中,它是这样的: #include <iostream> using namespace std; enum A { a = 1, b = 69, c= 666 }; int main () { A a = A::c; cout << a << endl; } 在c ++ 0x中,此代码无法编译 #include <iostream> using namespace std; enum class A { a …

6
为什么std :: initializer_list不是内置语言?
为什么没有std::initializer_list内置核心语言? 在我看来,它是C ++ 11的重要功能,但它没有自己的reserved关键字(或类似名称)。 相反,initializer_list它只是标准库中的模板类,它具有由编译器处理的新的braced-init-list语法的特殊隐式映射。 {...} 乍一看,这种解决方案是很棘手的。 现在是通过新的C ++语言实现方式吗:通过某些模板类的隐式角色而不是核心语言? 请考虑以下示例: widget<int> w = {1,2,3}; //this is how we want to use a class 为什么选择新班级: widget( std::initializer_list<T> init ) 而不是使用类似于以下任何想法的东西: widget( T[] init, int length ) // (1) widget( T... init ) // (2) widget( std::vector<T> init ) // (3) 一个经典的数组,您可能会在const这里和那里添加 …

5
我可以对仅移动类型的向量进行列表初始化吗?
如果我通过GCC 4.7快照传递以下代码,它将尝试将unique_ptrs 复制到向量中。 #include <vector> #include <memory> int main() { using move_only = std::unique_ptr<int>; std::vector<move_only> v { move_only(), move_only(), move_only() }; } 显然,这std::unique_ptr是不可操作的,因为不可复制: 错误:使用删除的函数'std :: unique_ptr <_Tp,_Dp> :: unique_ptr(const std :: unique_ptr <_Tp,_Dp>&)[with _Tp = int; _Dp = std :: default_delete; std :: unique_ptr <_Tp,_Dp> = std :: unique_ptr]' GCC在尝试从初始化列表中复制指针时是否正确?

3
如何正确检查std :: function在C ++ 11中是否为空?
我想知道如何正确检查an std::function是否为空。考虑以下示例: class Test { std::function<void(int a)> eventFunc; void registerEvent(std::function<void(int a)> e) { eventFunc = e; } void doSomething() { ... eventFunc(42); } }; 这段代码在MSVC中可以很好地编译,但是如果我doSomething()不初始化就调用eventFunc该代码,则显然会崩溃。这是预期的,但我想知道的价值是eventFunc什么?调试器说'empty'。所以我用简单的if语句解决了这个问题: void doSomething() { ... if (eventFunc) { eventFunc(42); } } 这有效,但我仍然想知道未初始化的值是std::function什么?我想写,if (eventFunc != nullptr)但是std::function(显然)不是指针。 为什么纯如果有效?它背后的魔力是什么?而且,这是检查方法的正确方法吗?

2
“ C ++编程语言”第4版第36.3.6节中的代码是否具有明确的行为?
在Bjarne Stroustrup的C ++编程语言第4版第36.3.6 STL类操作中,以下代码用作链接的示例: void f2() { std::string s = "but I have heard it works even if you don't believe in it" ; s.replace(0, 4, "" ).replace( s.find( "even" ), 4, "only" ) .replace( s.find( " don't" ), 6, "" ); assert( s == "I have heard it works …


3
何时使用括号括起来的初始化程序?
在C ++ 11中,我们具有用于初始化类的新语法,这为我们提供了许多初始化变量的可能性。 { // Example 1 int b(1); int a{1}; int c = 1; int d = {1}; } { // Example 2 std::complex<double> b(3,4); std::complex<double> a{3,4}; std::complex<double> c = {3,4}; auto d = std::complex<double>(3,4); auto e = std::complex<double>{3,4}; } { // Example 3 std::string a(3,'x'); std::string b{3,'x'}; // …

8
捕获为函数指针的C ++ lambda
我在玩C ++ lambda及其隐式转换为函数指针。我的开始示例是将它们用作ftw函数的回调。这按预期工作。 #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> …

6
在编译时计算C字符串的长度。这真的是constexpr吗?
我正在尝试在编译时计算字符串文字的长度。为此,我使用以下代码: #include <cstdio> int constexpr length(const char* str) { return *str ? 1 + length(str + 1) : 0; } int main() { printf("%d %d", length("abcd"), length("abcdefgh")); } 一切正常,程序输出4和8。clang生成的汇编代码表明结果是在编译时计算的: 0x100000f5e: leaq 0x35(%rip), %rdi ; "%d %d" 0x100000f65: movl $0x4, %esi 0x100000f6a: movl $0x8, %edx 0x100000f6f: xorl %eax, %eax 0x100000f71: callq …

4
如何从<chrono>中获取持续时间(以毫秒为单位)和浮点秒?
我正在尝试使用chrono库作为计时器和持续时间。 我希望能够有一个Duration frameStart;(从应用程序开始)和一个Duration frameDelta;(帧之间的时间) 我需要能够获得frameDelta持续时间(以毫秒为单位)和浮点秒。 如何使用新的c ++ 11&lt;chrono&gt;库执行此操作?我一直在努力并进行谷歌搜索(信息稀疏)。该代码是大量模板化的,需要特殊的强制类型转换和其他操作,我无法弄清楚如何正确使用此库。
94 c++  c++11  timer  chrono 

6
C ++终止调用,没有活动异常
我在线程获取C ++错误: terminate called without an active exception Aborted 这是代码: #include &lt;queue&gt; #include &lt;thread&gt; #include &lt;mutex&gt; #include &lt;condition_variable&gt; template&lt;typename TYPE&gt; class blocking_stream { public: blocking_stream(size_t max_buffer_size_) : max_buffer_size(max_buffer_size_) { } //PUSH data into the buffer blocking_stream &amp;operator&lt;&lt;(TYPE &amp;other) { std::unique_lock&lt;std::mutex&gt; mtx_lock(mtx); while(buffer.size()&gt;=max_buffer_size) stop_if_full.wait(mtx_lock); buffer.push(std::move(other)); mtx_lock.unlock(); stop_if_empty.notify_one(); return *this; } //POP …

15
C ++ 11是否具有C#样式的属性?
在C#中,使用getter和setter的字段有一个不错的语法糖。此外,我喜欢自动执行的属性,这些属性使我可以编写 public Foo foo { get; private set; } 在C ++中,我必须编写 private: Foo foo; public: Foo getFoo() { return foo; } C ++ 11中是否有这样的概念,可以让我对此有所了解?
93 c#  c++  class  c++11 

2
[=]在C ++中是什么意思?
我想知道是什么[=]?这是一个简短的例子 template &lt;typename T&gt; std::function&lt;T (T)&gt; makeConverter(T factor, T offset) { return [=] (T input) -&gt; T { return (offset + input) * factor; }; } auto milesToKm = makeConverter(1.60936, 0.0); 该代码如何与[]代替一起使用[=]? 我认为 std::function&lt;T (T)&gt; 是指(T)作为参数和返回类型获取的函数原型T?
93 c++  c++11  lambda 

1
使用+解决lambda的函数指针和std :: function上的模棱两可的重载
在以下代码中,对的第一次调用foo是不明确的,因此无法编译。 第二个+在lambda之前添加,解析为函数指针重载。 #include &lt;functional&gt; void foo(std::function&lt;void()&gt; f) { f(); } void foo(void (*f)()) { f(); } int main () { foo( [](){} ); // ambiguous foo( +[](){} ); // not ambiguous (calls the function pointer overload) } +这里的符号是什么?

4
将shared_ptr <Derived>作为shared_ptr <Base>传递
将shared_ptr派生类型的a传递给采用shared_ptr基本类型的a的函数的最佳方法是什么? 通常,我shared_ptr通过引用传递s以避免不必要的复制: int foo(const shared_ptr&lt;bar&gt;&amp; ptr); 但是如果我尝试做类似的事情这是行不通的 int foo(const shared_ptr&lt;Base&gt;&amp; ptr); ... shared_ptr&lt;Derived&gt; bar = make_shared&lt;Derived&gt;(); foo(bar); 我可以用 foo(dynamic_pointer_cast&lt;Base, Derived&gt;(bar)); 但这似乎不太理想,原因有两个: 一个dynamic_cast似乎有点过度了一个简单的衍生到基础施法。 据我了解,dynamic_pointer_cast创建指针的副本(尽管是临时的)以传递给函数。 有更好的解决方案吗? 后代更新: 原来是缺少头文件的问题。另外,我在这里尝试执行的操作也被视为反模式。通常, 不影响对象生命周期的函数(即对象在函数持续时间内保持有效)应采用简单的引用或指针,例如int foo(bar&amp; b)。 占用对象的函数(即给定对象的最终用户)应采用unique_ptr按值,例如int foo(unique_ptr&lt;bar&gt; b)。std::move调用者应将值放入函数中。 延长对象寿命的函数应采用shared_ptr按值,例如int foo(shared_ptr&lt;bar&gt; b)。避免循环引用的通常建议适用。 有关详细信息,请参见Herb Sutter的“基础知识”演讲。

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.