Questions tagged «c++11»

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

4
auto &&告诉我们什么?
如果您阅读类似的代码 auto&& var = foo(); foo根据type的值返回的任何函数在哪里T?然后var是rvalue类型的左值引用T。但是,这意味着var什么呢?这是否意味着我们被允许窃取的资源var?是否有任何合理的情况下,您应该auto&&像unique_ptr<>告诉您拥有独占所有权时一样,告诉读者您的代码?那例如什么T&&时候T是类类型呢? 我只是想了解一下,是否还有auto&&模板编程之外的其他用例?就像Scott Meyers 在本文“ 通用参考”中的示例中所讨论的一样。

6
如何在Qt Creator中启用C ++ 11?
标题很容易描述。我已经下载了Qt Creator 2.7.0,并且正在尝试编译一些基本的C ++ 11代码: int my_array[5] = {1, 2, 3, 4, 5}; for(int &x : my_array) { x *= 2; } 我收到以下错误: range based for loops are not allowed in c++ 98 mode 但是,根据本文,此版本的Qt Creator支持C ++ 11。那么如何启用它呢?
167 c++  qt  c++11 

8
Lambda捕获作为const参考吗?
是否可以通过const引用在Lambda表达式中捕获? 我希望下面标记的作业失败,例如: #include <cstdlib> #include <vector> #include <string> #include <algorithm> using namespace std; int main() { string strings[] = { "hello", "world" }; static const size_t num_strings = sizeof(strings)/sizeof(strings[0]); string best_string = "foo"; for_each( &strings[0], &strings[num_strings], [&best_string](const string& s) { best_string = s; // this should fail } ); return …
166 c++  c++11  lambda  c++14 

3
为什么我应该避免在函数签名中使用std :: enable_if
Scott Meyers发布了他的下一本书EC ++ 11的内容和状态。他写道,书中的一项可能是“避免std::enable_if使用函数签名”。 std::enable_if 可用作函数参数,返回类型或类模板或函数模板参数,以有条件地从重载解析中删除函数或类。 在此问题中,显示了所有三种解决方案。 作为功​​能参数: template<typename T> struct Check1 { template<typename U = T> U read(typename std::enable_if< std::is_same<U, int>::value >::type* = 0) { return 42; } template<typename U = T> U read(typename std::enable_if< std::is_same<U, double>::value >::type* = 0) { return 3.14; } }; 作为模板参数: template<typename T> struct …

6
虚函数可以具有默认参数吗?
如果我声明一个基类(或接口类)并为其一个或多个参数指定默认值,那么派生类是否必须指定相同的默认值;如果没有,那么默认值将出现在派生类中吗? 附录:我也对在不同的编译器中如何处理此问题以及在这种情况下对“推荐”实践的任何投入感兴趣。
164 c++  c++11  c++03 

11
如何自动将强类型的枚举转换为int?
#include <iostream> struct a { enum LOCAL_A { A1, A2 }; }; enum class b { B1, B2 }; int foo(int input) { return input; } int main(void) { std::cout << foo(a::A1) << std::endl; std::cout << foo(static_cast<int>(b::B2)) << std::endl; } 这a::LOCAL_A是强类型枚举试图实现的目标,但是有一个小的区别:普通枚举可以转换为整数类型,而强类型枚举不能在没有强制转换的情况下做到。 因此,有没有一种方法可以将强类型的枚举值转换为整数类型而无需强制转换?如果是,怎么办?

7
使用nullptr有什么优势?
这段代码在概念上对三个指针(安全指针初始化)执行相同的操作: int* p1 = nullptr; int* p2 = NULL; int* p3 = 0; 那么,分配指针nullptr比给它们分配值NULLor有0什么好处?
163 c++  c++11  null  c++-faq  nullptr 

3
为什么从字符串常量到'char *'的转换在C中有效但在C ++中无效
C ++ 11标准(ISO / IEC 14882:2011)在§ C.1.1: char* p = "abc"; // valid in C, invalid in C++ 对于C ++,因为指向字符串文字的指针是有害的,因为任何对其进行修改的尝试都将导致崩溃,这是有害的。但是为什么在C语言中有效呢? C ++ 11还说: char* p = (char*)"abc"; // OK: cast added 这意味着如果将强制类型转换添加到第一条语句中,它将变为有效。 为什么强制转换使第二条语句在C ++中有效,它与第一条语句有何不同?还是有害吗?如果是这样,为什么标准说没问题?
162 c++  c  string  c++11  char 

7
std :: function vs template
感谢C ++ 11,我们获得了std::function函子包装器系列。不幸的是,我一直只听到关于这些新功能的坏消息。最受欢迎的是,它们运行缓慢。我测试了一下,与模板相比,它们确实很烂。 #include <iostream> #include <functional> #include <string> #include <chrono> template <typename F> float calc1(F f) { return -1.0f * f(3.3f) + 666.0f; } float calc2(std::function<float(float)> f) { return -1.0f * f(3.3f) + 666.0f; } int main() { using namespace std::chrono; const auto tp1 = system_clock::now(); for (int i …


2
为班级成员使用智能指针
我在理解智能指针在C ++ 11中作为类成员的用法时遇到了麻烦。我已经阅读了很多关于智能指针,我想我不知道如何unique_ptr和shared_ptr/ weak_ptr做工一般。我不明白的是真正的用法。似乎每个人都建议将其unique_ptr作为几乎所有时间都使用的方式。但是我将如何实现这样的事情: class Device { }; class Settings { Device *device; public: Settings(Device *device) { this->device = device; } Device *getDevice() { return device; } }; int main() { Device *device = new Device(); Settings settings(device); // ... Device *myDevice = settings.getDevice(); // do something with myDevice... } …


6
在Lambda中移动捕获
如何在C ++ 11 lambda中通过移动(也称为右值引用)捕获? 我正在尝试写这样的东西: std::unique_ptr<int> myPointer(new int); std::function<void(void)> example = [std::move(myPointer)]{ *myPointer = 4; };

7
std :: enable_if有条件地编译成员函数
我试图通过一个简单的示例来了解如何使用std::enable_if。在阅读完此答案后,我想出一个简单的例子应该不难。我想使用std::enable_if两个成员函数之间进行选择,并只允许使用其中之一。 不幸的是,以下代码无法在gcc 4.7中进行编译,经过数小时的尝试,我一直在问你们我的错误是什么。 #include <utility> #include <iostream> template< class T > class Y { public: template < typename = typename std::enable_if< true >::type > T foo() { return 10; } template < typename = typename std::enable_if< false >::type > T foo() { return 10; } }; int main() { Y< …
156 c++  templates  g++  c++11 

3
何时使用std :: forward转发参数?
C ++ 0x显示了使用示例std::forward: template<class T> void foo(T&& arg) { bar(std::forward<T>(arg)); } 何时总是有利于使用std::forward? 另外,它要求&&在参数声明中使用,是否在所有情况下均有效?我以为如果在函数中声明了函数,则必须将临时函数传递给函数&&,因此可以用任何参数调用foo吗? 最后,如果我有这样的函数调用: template<int val, typename... Params> void doSomething(Params... args) { doSomethingElse<val, Params...>(args...); } 我应该用这个代替吗: template<int val, typename... Params> void doSomething(Params&&... args) { doSomethingElse<val, Params...>(std::forward<Params>(args)...); } 另外,如果在函数中使用两次参数,即同时转发到两个函数,使用它是否明智std::forward?不会std::forward将同一事物转换为临时对象两次,从而移动内存并使之无效以再次使用吗?下列代码可以吗: template<int val, typename... Params> void doSomething(Params&&... args) { doSomethingElse<val, Params...>(std::forward<Params>(args)...); doSomethingWeird<val, Params...>(std::forward<Params>(args)...); …

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.