Questions tagged «c++11»

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


2
#pragma是否曾经是C ++ 11标准的一部分?
传统上,避免C ++中包含多个标头的标准且可移植的方法是使用#ifndef - #define - #endif预编译器指令方案,该方案也称为宏保护方案(请参见下面的代码段)。 #ifndef MY_HEADER_HPP #define MY_HEADER_HPP ... #endif 但是,在大多数实现/编译器中(请参见下图),还有一个更“优雅”的替代方案,其作用与称为的宏保护方案相同#pragma once。#pragma once与宏保护方案相比,它具有多个优点,包括更少的代码,避免名称冲突以及有时提高了编译速度。 经过研究,我意识到尽管#pragma once几乎所有已知的编译器都支持伪指令,但是伪#pragma once指令是否属于C ++ 11标准还是有一定的困惑。 问题: 有人可以澄清#pragma once指令是否属于C ++ 11标准吗? 如果它不是C ++ 11标准的一部分,是否有任何计划将其包含在更高版本中(例如C ++ 14或更高版本)? 如果有人可以进一步详细说明使用这两种技术中的任何一种(例如,宏观卫士与#pragma once)的优势/劣势,那也很好。

5
我什么时候应该使用std :: thread :: detach?
有时我必须使用它std::thread来加速我的应用程序。我也知道join()等到线程完成。这很容易理解,但是调用detach()和不调用有什么区别? 我以为如果没有detach(),线程的方法将独立使用线程工作。 不分离: void Someclass::Somefunction() { //... std::thread t([ ] { printf("thread called without detach"); }); //some code here } 调用与分离: void Someclass::Somefunction() { //... std::thread t([ ] { printf("thread called with detach"); }); t.detach(); //some code here }
140 c++  c++11  stdthread 

12
用户定义的文字为C ++添加了哪些新功能?
C ++ 11台引入了用户定义的文字,这将允许基于现有字面引入新文本语法的(int,hex,string,float),使得任何类型的将能够具有字介绍。 例子: // imaginary numbers std::complex<long double> operator "" _i(long double d) // cooked form { return std::complex<long double>(0, d); } auto val = 3.14_i; // val = complex<long double>(0, 3.14) // binary values int operator "" _B(const char*); // raw form int answer = 101010_B; // answer …

4
为什么可以在私有类型上使用auto?
我惊讶地发现以下代码可以编译并运行(vc2012&gcc4.7.2) class Foo { struct Bar { int i; }; public: Bar Baz() { return Bar(); } }; int main() { Foo f; // Foo::Bar b = f.Baz(); // error auto b = f.Baz(); // ok std::cout << b.i; } 这段代码编译正确吗?为什么正确呢?为什么我auto不能使用它的名称(如预期的那样)而使用私有类型?

3
有效的C ++仍然有效吗?
从我在这篇文章中看到的内容,我决定开始阅读《有效的C ++》一书。 但是,由于C ++ 11带来了许多新功能,并且一些良好实践发生了变化,所以我不确定这是否是一个好主意。C ++ 11的出现是否已淘汰有效C ++中包含的任何建议?如果是这样,我应该避免哪些主题?

2
我如何处理移出的物体?
该标准是否精确定义了对象从对象移出后可以做什么?我曾经认为,对移出的对象可以做的只是破坏它,但这还不够。 例如,采用swap标准库中定义的功能模板: template <typename T> void swap(T& a, T& b) { T c = std::move(a); // line 1 a = std::move(b); // line 2: assignment to moved-from object! b = std::move(c); // line 3: assignment to moved-from object! } 显然,必须可以将其分配给移出的对象,否则第2行和第3行将失败。那么我还能对移出的对象做什么呢?我在哪里可以在标准中找到这些详细信息? (顺便说一句,为什么T c = std::move(a);不是T c(std::move(a));第1行呢?)


10
如何使用std :: array模拟C数组初始化“ int arr [] = {e1,e2,e3,…}”行为?
(注意:这个问题是关于不必指定元素的数量,而仍然允许嵌套类型直接初始化。) 这个问题讨论了C数组(如)所剩下的用法int arr[20];。@James Kanze 在回答中显示了C数组的最后据点之一,它具有独特的初始化特性: int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 }; 我们不必指定元素的数量,万岁!现在,使用C ++ 11函数std::begin和std::endfrom <iterator>(或您自己的变体)对其进行迭代,您甚至无需考虑其大小。 现在,是否有任何(可能是TMP)方法可以达到相同目的std::array?允许使用宏使它看起来更好。:) ??? std_array = { "here", "be", "elements" }; 编辑:中级版本,从各种答案编译而成,如下所示: #include <array> #include <utility> template<class T, class... Tail, class Elem = typename …

15
在C ++中方便地声明编译时字符串
能够在C ++中的编译期间创建和操作字符串有几个有用的应用程序。尽管可以用C ++创建编译时字符串,但是该过程非常繁琐,因为需要将字符串声明为可变的字符序列,例如 using str = sequence<'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!'>; 诸如字符串连接,子字符串提取等操作很容易实现为对字符序列的操作。是否可以更方便地声明编译时字符串?如果没有,那么作品中是否有建议可以方便地声明编译时字符串? 为什么现有方法失败 理想情况下,我们希望能够声明如下编译时字符串: // Approach 1 using str1 = sequence<"Hello, world!">; 或者,使用用户定义的文字, // Approach 2 constexpr auto str2 = "Hello, world!"_s; 哪里decltype(str2)会有constexpr构造函数。可以利用以下事实来实现方法1的更混乱的版本: template <unsigned Size, const char Array[Size]> struct foo; …


5
C ++ 11中的新语法“ = default”
我不明白为什么要这么做: struct S { int a; S(int aa) : a(aa) {} S() = default; }; 为什么不说: S() {} // instead of S() = default; 为什么要为此引入新的语法?
136 c++  c++11 

13
如何将元组扩展为可变参数模板函数的参数?
考虑带有可变参数模板参数的模板化函数的情况: template<typename Tret, typename... T> Tret func(const T&... t); 现在,我有了一个t价值元组。如何func()使用元组值作为参数调用?我已经阅读了有关bind()函数对象,call()函数以及apply()其他一些过时文档中的函数。GNU GCC 4.4实现似乎call()在bind()该类中具有一个功能,但是关于该主题的文档很少。 有人建议使用手写递归黑客技术,但是可变参数模板参数的真正价值在于能够在上述情况下使用它们。 有没有人对is有解决方案,或暗示在哪里可以找到它?
135 c++  c++11  arguments  tuples 

6
使用C ++ 11随机库生成随机数
如标题所示,我正在尝试找到一种使用新的C ++ 11 <random>库生成随机数的方法。我已经用以下代码尝试过: std::default_random_engine generator; std::uniform_real_distribution<double> uniform_distance(1, 10.001); 我的代码存在的问题是,每次我编译并运行它时,它总是生成相同的数字。所以我的问题是,在真正随机的情况下,随机库中还有哪些其他函数可以完成此任务? 对于我的特定用例,我试图获得一个范围内的值 [1, 10]
135 c++  c++11  random  range 

4
是否可以找出lambda的参数类型和返回类型?
给定一个lambda,是否可以弄清楚它的参数类型和返回类型?如果是,怎么办? 基本上,我希望lambda_traits可以通过以下方式使用它: auto lambda = [](int i) { return long(i*10); }; lambda_traits<decltype(lambda)>::param_type i; //i should be int lambda_traits<decltype(lambda)>::return_type l; //l should be long 其背后的动机是,我想lambda_traits在接受lambda作为参数的函数模板中使用,并且我需要知道函数内部的参数类型和返回类型: template<typename TLambda> void f(TLambda lambda) { typedef typename lambda_traits<TLambda>::param_type P; typedef typename lambda_traits<TLambda>::return_type R; std::function<R(P)> fun = lambda; //I want to do this! //... } 就目前而言,我们可以假设lambda正好采用了一个参数。 …

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.