-
C++14
2017-04-07 16:20:46 -
c++14
2017-09-04 16:37:35转自: ... C++14是C++的现行标准的非正式名称,正式名称为"International ... Standard ISO/IEC 14882:2014(E) Programming Language C++"。c++14旨在作为C++11的一个小扩展,主要提供漏洞...C++14标准的委员会草案转自:
https://zh.wikipedia.org/wiki/C%2B%2B14
C++14是C++的现行标准的非正式名称,正式名称为"International Standard ISO/IEC 14882:2014(E) Programming Language C++"。c++14旨在作为C++11的一个小扩展,主要提供漏洞修复和小的改进。C++14标准的委员会草案(Committee Draft)N3690于2013年5月15日发表。[1]工作草案(Working Draft)N3936已于2014年03月02日完成。最终的投票期结束于2014年8月15日,结果(一致通过)已于8月18日公布。[2]
新的语言特性
以下为在C++14中被加入语言核心的特性。
泛型的lambda
在C++11中,lambda函数的形式参数需要被声明为具体的类型。C++14放宽了这一要求,允许lambda函数的形式参数声明中使用类型说明符
auto
。[3]auto lambda = [](auto x, auto y) {return x + y;}
泛型lambda函数遵循模板参数推导的规则。以上代码的作用与下面的代码相同:[4]
struct unnamed_lambda { template<typename T, typename U> auto operator()(T x, U y) const {return x + y;} }; auto lambda = unnamed_lambda();
Lambda捕获部分中使用表达式
C++11的lambda函数通过值拷贝(by copy)或引用(by reference)捕获(capture)已在外层作用域声明的变量。这意味着lambda的值成员不可以是move-only的类型。[5] C++14允许被捕获的成员用任意的表达式初始化。这既允许了capture by value-move,也允许了任意声明lambda的成员,而不需要外层作用域有一个具有相应名字的变量。[6]
这是通过使用一个初始化表达式完成的:
auto lambda = [value = 1] {return value;}
lambda函数
lambda
的返回值是1,说明value
被初始化为1。被声明的捕获变量的类型会根据初始化表达式推断,推断方式与用auto
声明变量相同。使用标准函数
std::move
可以使之被用以通过move捕获:auto ptr = std::make_unique<int>(10); //See below for std::make_unique auto lambda = [ptr = std::move(ptr)] {return *ptr;}
声明
ptr = std::move(ptr)
使用了两次ptr
。第一次使用声明了一个新的变量,但在捕获部分,这个变量还不在作用域内。所以第二个ptr
表示之前在lambda之外声明的变量。[7]函数返回类型推导
C++11允许lambda函数根据return语句的表达式类型推断返回类型。C++14为一般的函数也提供了这个能力。C++14还拓展了原有的规则,使得函数体并不是
{return expression;}
形式的函数也可以使用返回类型推导。[8]为了启用返回类型推导,函数声明必须将
auto
作为返回类型,但没有C++11的后置返回类型说明符:auto DeduceReturnType(); //返回类型由编译器推断
如果函数实现中含有多个return语句,这些表达式必须可以推断为相同的类型。[9]
使用返回类型推导的函数可以前向声明,但在定义之前不可以使用。它们的定义在使用它们的翻译单元(translation unit)之中必须是可用的。
这样的函数中可以存在递归,但递归调用必须在函数定义中的至少一个return语句之后:[9]
auto Correct(int i) { if (i == 1) return i; // 返回类型被推断为int else return Correct(i-1)+i; // 正确,可以调用 } auto Wrong(int i) { if(i != 1) return Wrong(i-1)+i; // 不能调用,之前没有return语句 else return i; // 返回类型被推断为int }
另一种类型推断
C++11中有两种推断类型的方式。
auto
根据给出的表达式产生具有合适类型的变量。decltype
可以计算给出的表达式的类型。但是,decltype
和auto
推断类型的方式是不同的。特别地,auto
总是推断出非引用类型,就好像使用了std::remove_reference
一样,而auto&&
总是推断出引用类型。然而decltype
可以根据表达式的值类别(value category)和表达式的性质推断出引用或非引用类型:[8]int i; int&& f(); auto x3a = i; // x3a的类型是int decltype(i) x3d = i; // x3d的类型是int auto x4a = (i); // x4a的类型是int decltype((i)) x4d = (i); // x4d的类型是int& auto x5a = f(); // x5a的类型是int decltype(f()) x5d = f(); // x5d的类型是int&&
C++14增加了
decltype(auto)
的语法。这允许不必显式指定作为decltype
参数的表达式,而使用decltype
对于给定表达式的推断规则。decltype(auto)
的语法也可以用于返回类型推导,只需用decltype(auto)
代替auto
。[9]放松的constexpr限制
C++11引入了声明为constexpr的函数的概念。声明为constexpr函数的意义是:如果其参数均为合适的编译期常量,则对这个constexpr函数的调用就可用于期望常量表达式的场合(如模板的非类型参数,或枚举常量的值)。如果参数的值在运行期才能确定,或者虽然参数的值是编译期常量,但不符合这个函数的要求,则对这个函数调用的求值只能在运行期进行。然而C++11要求constexpr函数只含有一个将被返回的表达式(也可以还含有
static_assert
声明等其它语句,但允许的语句类型很少)。C++14将放松这些限制。声明为constexpr的函数可以含有以下内容:[8]
- 任何声明,除了:
static
或thread_local
变量。- 没有初始化的变量声明。
- 条件分支语句
if
和switch
。 - 所有的循环语句,包括基于范围的
for
循环。 - 表达式可以改变一个对象的值,只需该对象的生命期在声明为constexpr的函数内部开始。包括对有
constexpr
声明的任何非const
非静态成员函数的调用。
goto
仍然不允许在constexpr函数中出现。此外,C++11指出,所有被声明为
constexpr
的非静态成员函数也隐含声明为const
(即函数不能修改*this的值)。这点已经被删除,非静态成员函数可以为非const
。[10]变量模板
在C++之前的版本中,模板可以是函数模板或类模板(C++11引入了类型别名模板)。C++14现在也可以创建变量模板。包括特化在内,通常的模板的规则都适用于变量模板的声明和定义。[6][11]
聚合体成员初始化
C++11新增member initializer,这是一个表达式,被应用到类作用域的成员上,如果构造函数没有初始化这个成员。聚合体的定义被改为明确排除任何含有member initializer的类,因此,他们不允许使用聚合初始化。
C++14将放松这一限制,[8]这种类型也允许聚合初始化。如果花括号初始化列表不提供该参数的值,member initializer会初始化它。[12]
二进制字面量
C++14的数字可以用二进制形式指定。[8]其格式使用前缀
0b
或0B
。这样的语法也被Java、Python、Perl和D语言使用。数字分位符
C++14引入单引号(')作为数字分位符号,使得数值型的字面量可以具有更好的可读性。[13]
Ada、D语言、Java、Perl、Ruby等程序设计语言使用下划线(_)作为数字分位符号,C++之所以不和它们保持一致,是因为下划线已被用在用户自定义的字面量的语法中。
auto integer_literal = 100'0000; auto floating_point_literal = 1.797'693'134'862'315'7E+308; auto binary_literal = 0b0100'1100'0110; auto silly_example = 1'0'0'000'00;
新的标准库特性
共享的互斥体和锁
C++14增加了一类共享的互斥体和相应的共享锁[14][15]。起初选择的名字是
std::shared_mutex
,但由于后来增加了与std::timed_mutex
相似的特性,std::shared_timed_mutex
成为了更适合的名字。[16]元函数的别名
C++11定义了一组元函数,用于查询一个给定类型是否具有某种特征,或者转换给定类型的某种特征,从而得到另一个类型。后一种元函数通过成员类型type来返回转换后的类型,当它们用在模板中时,必须使用typename关键字,这会增加代码的长度。
template <class T> type_object< typename std::remove_cv< typename std::remove_reference<T>::type >::type >get_type_object(T&);
利用类型别名模板,C++14提供了更便捷的写法。其命名规则是:如果标准库的某个类模板(假设为
std::some_class
)只含有唯一的成员,即成员类型type,那么标准库提供std::some_class_t<T>
作为typename std::some_class::type
的别名。在C++14,拥有类型别名的元函数包括:remove_const、remove_volatile、remove_cv、add_const、add_volatile、add_cv、remove_reference、add_lvalue_reference、add_rvalue_reference、make_signed、make_unsigned、remove_extent、remove_all_extents、remove_pointer、add_pointer、aligned_storage、aligned_union、decay、 enable_if、conditional、common_type、underlying_type、result_of、tuple_element。
template <class T> type_object<std::remove_cv_t<std::remove_reference_t<T>>> get_type_object(T&);
关联容器中的异构查找
C++标准库定义了四个关联容器类。set和multiset允许用户根据一个值在容器中查找对应的的同类型的值。map和multimap容器允许用户指定键(key)和值(value)的类型,根据键进行查找并返回对应的值。然而,查找只能接受指定类型的参数,在map和multimap中是键的类型,而在set和multiset容器中就是值本身的类型。
C++14允许通过其他类型进行查找,只需要这个类型和实际的键类型之间可以进行比较操作。[17]这允许
std::set<std::string>
使用const char*
,或任何可以通过operator<
与std::string
比较的类型作为查找的参数。为保证向后兼容性,这种异构查找只在提供给关联容器的比较器允许的情况下有效。标准库的泛型比较器,如
std::less<>
与std::greater<>
允许异构查找。[18]标准自定义字面量
C++11增加了自定义字面量(user-defined literals)的特性,使用户能够定义新的字面量后缀,但标准库并没有对这一特性加以利用。C++14标准库定义了以下字面量后缀:[17]
- "s",用于创建各种
std::basic_string
类型。 - "h"、"min"、"s"、"ms"、"us"、"ns",用于创建相应的
std::chrono::duration
时间间隔。
using namespace std::literals; std::string str = "hello world"s; std::chrono::seconds dur = 60s;
两个"s"互不干扰,因为表示字符串的只能对字符串字面量操作,而表示秒的只针对数字。[19]
通过类型寻址多元组
C++11引入的
std::tuple
类型允许不同类型的值的聚合体用编译期整型常数索引。C++14还允许使用类型代替常数索引,从多元组中获取对象。[17]若多元组含有多于一个这个类型的对象,将会产生一个编译错误:[20]tuple<string, string, int> t("foo", "bar", 7); int i = get<int>(t); // i == 7 int j = get<2>(t); // Same as before: j == 7 string s = get<string>(t); //Compiler error due to ambiguity
较小的标准库特性
std::make_unique
可以像std::make_shared
一样使用,用于产生std::unique_ptr
对象。[6]std::is_final
,用于识别一个class类型是否禁止被继承。std::integral_constant
增加了一个返回常量值的operator()
。[17]全局
std::begin/std::end
函数之外,增加了std::cbegin/std::cend
函数,它们总是返回常量迭代器(constant iterators)。已被移除或是不包含在C++14标准的特性
因为C++14的主要目的是漏洞修复和小的改进,一些重量级的特性被从C++14中移除,而移入各自的Technical Specification,并有可能合并入未来的C++17标准。
关于数组的扩展
以下特性将由Technical Specification—Array Extensions提供支持。[21]
在C++11和之前的标准中,在堆栈上分配的数组被限制为拥有一个固定的、编译期确定的长度。这一扩展允许在堆栈上分配的一个数组的最后一维具有运行期确定的长度。[6]
运行期确定长度的数组不可以作为对象的一部分,也不可以具有全局存储期,他们只能被声明为局部变量。运行期确定长度的数组也可以使用C++11的基于范围的for循环。[22]
同时还将添加
std::dynarray
类型,它拥有与std::vector
和std::array
相似的接口。代表一个固定长度的数组,其大小在运行期构造对象时确定。std::dynarray
类被明显地设计为当它被放置在栈上时(直接放置在栈上,或作为另一个栈对象的成员),可以使用栈内存而不是堆内存。Optional值
以下特性将由C++ Extensions for Library Fundamentals提供支持。[23]
类似于C#中的可空类型,optional类型可能含有或不含有一个值。这一类型基于Boost的
boost::optional
类,而添加了C++11和C++14中的新特性,诸如移动和in-place构造。它不允许用在引用类型上。这个类被专门的设计为一个literal type(如果模板参数本身是一个literal type),因此,它在必要的情况下含有constexpr构造函数。[24]Concepts Lite
被C++11拒绝后,Concepts受到彻底的修改。Concepts Lite是Concepts的一个部分,仅包含类型约束,而不含
concept_map
和axiom
[25]。它将在一个单独的Technical Specification中发展,并有可能加入C++17。 - 任何声明,除了:
-
C++ 14
2015-11-30 11:17:00刚看到C++ 11现在又出来个C++14,挖坑。 转载于:https://www.cnblogs.com/bluewhy/p/5006662.html刚看到C++ 11现在又出来个C++14,挖坑。转载于:https://www.cnblogs.com/bluewhy/p/5006662.html
-
C++98,C++11,C++14,C++17
2020-09-16 07:21:52压缩包内包含标准C++98、C++11、C++14、C++17,英文正式版,非DRAFT版本,请查看。 -
C++98/C++03/C++11/C++14/C++17/C++20 标准帮助文档 2020-09-04
2020-09-04 22:42:11C++98/C++03/C++11/C++14/C++17/C++20 标准帮助文档,更新于 2020 年 9 月 4 日。docsets 格式,可使用 zeal 软件查看 -
快速上手C++11和C++14
2018-07-09 17:15:36快速上手C++11和C++14,主要讲解了C11和C14的心特性。 -
ISO C++11和C++14 标准
2018-02-06 20:17:57iso c++11/c++14标准,价值几百美金。C++大神必备文档。 -
C++14新特性总结 - C++98 -> C++03 -> C++11 -> C++14 -> C++17
2016-12-28 14:40:51C++14新特性总结 - C++98 -> C++03 -> C++11 -> C++14 -> C++17http://www.infoq.com/cn/news/2014/09/cpp14-here-features
C++14这一继C++11之后的新的C++标准已经被正式批准,正在向ISO提交,将于年内发布。C++之父Bjarne Stroustrup说道,尽管与C++11相比,C++14的改进“有意做的比较小”,但是仍然为用户“带来了极大的方便”,是实现使C++“对新手更为友好”这一目标的步骤之一。
在C++的时间表中,C++14按计划是一个小版本,完成制定C++11标准的剩余工作,目的是使C++成为一门更清晰、更简单和更快速的语言。新的语言特性留到了未来的C++17标准中。
TS(Technical Specification)
C++14的主要特性可以分为三个领域:Lambda函数、constexpr和类型推导。
Lambda函数
C++14的泛型Lambda使编写如下语句成为可能:
auto lambda = [](auto x, auto y) {return x + y;};
而另一方面,C++11要求Lambda参数使用具体的类型声明,比如:
auto lambda = [](int x, int y) {return x + y;};
此外,新标准中的std::move函数可用于捕获Lambda表达式中的变量,这是通过移动对象而非复制或引用对象实现的:
std::unique_ptr ptr(new int(10)); auto lambda = [value = std::move(ptr)] {return *value;};
constexpr
在C++11中,使用constexpr声明的函数可以在编译时执行,生成一个值,用在需要常量表达式的地方,比如作为初始化模板的整形参数。C++11的constexpr函数只能包含一个表达式,C++14放松了这些限制,支持诸如if 和switch等条件语句,支持循环,其中包括基于区间(range)的for 循环。
类型推导
C++11仅支持Lambda函数的类型推导,C++14对其加以扩展,支持所有函数的返回类型推导:
auto DeducedReturnTypeFunction();
因为C++14是强类型语言,有些限制需要考虑:
- 如果一个函数的实现中有多个返回语句,这些语句一定要推导出同样的类型。
- 返回类型推导可以用在前向声明中,但是在使用它们之前,翻译单元中必须能够得到函数定义。
- 返回类型推导可以用在递归函数中,但是递归调用必须以至少一个返回语句作为先导,以便编译器推导出返回类型。
C++14带来的另一个类型推导方面的改进是decltype(auto)语法,它支持使用与auto同样的机制计算给定表达式的类型。auto和 decltype在C++11中就已经出现了,但是它们在推导类型时使用了不同的机制,这可能会产生不同的结果。
C++14中的其他改变包括可以声明变量模板,支持使用0b或0B前缀来声明二进制字面常量。InfoQ已经介绍过C++14中可能破坏C++11程序的其他小型修改。
主流C++编译器对新语言特性的支持正在有条不紊地开发:Clang“完全实现了当前草案的所有内容”;GCC和Visual Studio也对C++14的新特性提供了一些支持。
查看英文原文:C++14 Is Here: Summary of New Features
-
C99 & C++11 & C++14 & C++17 ISOIEC PDF
2019-01-23 18:45:02压缩包内容: 1、ISOIEC 9899 1999 [C99].pdf 2、ISO+IEC+14882-2011 [C++11].pdf 3、ISO+IEC+14882-2014 [C++14].pdf 4、ISO+IEC+14882-2017 [C++17].pdf -
【C++】C++14
2014-11-10 14:50:52最新的C++标准为C++14,即ISO/IEC14882:2014,从一开始的C++98到后来的C++03、C++11,以及若干年后的C++17,对广大C++爱好者来说,每一次的版本提升 无疑是一种福音,那就一起拥抱最新的C++技术,共创属于C++的辉煌... -
C++ 14 auto
2019-09-27 18:50:26C++14标准最近刚被通过,像以前一样,没有给这个语言带来太大变化,C++14标准是想通过改进C++11 来让程序员更加轻松的编程,C++11引入auto关键字(严格来说auto从C++ 03 开始就有了,只是C++11改变了auto的含义),... -
C++11 / C++14
2018-08-30 18:43:37C++11 / C++14 C++11 function lamda 不能使用ifdef *局部变量不先初始化 不用递归(不可控) 异常不能混用 不能用Tab键,应使用两个空格代替 使用unit32_t / unit64_t 操作符和参数间加空格间隔开 ... -
C++14 decltype
2017-02-08 20:30:09C++14 decltype -
[现代C++探秘:编码、工程与科研必修(基于C++ 14)(英文版)] 现代c++探秘:编码、工程与科研必修(基于...
2018-09-13 15:38:52[现代C++探秘:编码、工程与科研必修(基于C++ 14)(英文版)] 现代c++探秘:编码、工程与科研必修(基于c++ 14)(英文版)Discovering modern c+: An Intensive Course for Scientists, Engineers, and ... -
C++14语言特性和标准库-第一部
2020-06-30 11:15:08讲解C++14的新语法特性. 讲解C++14的新增标准库. 项目代码可以通过vs2017和g++编译. C++14的新增特性和标准库很少。 学习C++14特性之前需要先学习C++11的特性。 -
C++14标准(中文)
2019-01-17 16:01:48C++14标准中文版 基于C++11上面进行补充说明 新的语言特性、新的标准库特性、已被移除或是不包含在 C++14 标准的特性 -
C++14特性
2017-02-08 10:19:11C++14是C++的现行标准的非正式名称,正式名称为"International Standard ISO/IEC 14882:2014(E) Programming Language C++"。C++14旨在作为C++11的一个小扩展,主要提供漏洞修复和小的改进。C++14标准的委员会草案... -
C++ 14标准 简明教程.zip
2021-01-09 16:36:56C++ 14标准 简明教程.zip -
C++14新特性
2020-12-22 13:39:07在C++的时间表中,C++14按计划是一个小版本,完成制定C++11标准的剩余工作,目的是使C++成为一门更清晰、更简单和更快速的语言。新的语言特性留到了未来的C++17标准中。 C++14的主要特性可以分为三个领域:... -
c++14与c++17新特性总结分析.docx
2020-07-24 15:34:07C++14放宽了这一要求,允许lambda函数参数类型使用类型说明符auto。代码简洁,并且可以增强重构。 2. 二进制文字和数字分隔符 C++ 程序员现在可以创建一个二进制数字,向已经包含十进制,十六进制以及很少使用的八... -
C++14与C++17新特性,你想知道的都在这
2021-01-08 04:28:00——————————————C++14篇—————————————— 相对于C++11,C++14的改动可谓非常mini了,主要的改动一句话便是:扩大自动类型推断的应用范围。剩下的都是边边角角的小改动 这包括: 函数返回值... -
C99 | C11 | C++11 | C++14 | C++17官方手册(英文版) | 高清可打印
2020-12-02 10:43:45C99 | C11 | C++11 | C++14 | C++17官方手册(英文版) ;高清可打印;没有积分或不想用积分请私我 -
C++14介绍
2016-05-31 08:40:00C++14标准是 ISO/IEC 14882:2014 Information technology -- Programming languages -- C++ 的简称[1] 。在标准正式通过之前,原名C++1y。 C++14标准的委员会草案N3690于2013年5月15日发表。[2] 2014年8月18日... -
Effective.Modern.CPP.2014.11 c++11 c++14
2018-01-05 14:25:36C++提示必看好书。 Effective.Modern.CPP.2014.11 c++11 c++14 -
C++14 for Qt programmers
2016-10-18 15:56:25讲述如何在Qt中使用C++14的特性 -
如何让Dev C++可以使用C++11、C++14标准
2020-03-07 02:03:24最新版本的Dev C++(即5.11版),经过以下操作后可完美使用新版本C++标准。 1、Tools ——> Compiler Options. 2、勾选“Add the following commands when calling the...如果要支持c++14,可以填入"-std=c... -
c++14新特性
2020-08-21 08:42:21# C++14 ## Overview Many of these descriptions and examples come from various resources (see [Acknowledgements](#acknowledgements) section), summarized in my own words. C++14 includes the following ... -
C++11 & C++14 & C++17.rar
2020-02-25 11:26:02ISO-IEC-14882 C++11、14、17 C++ 标准官方文档(英文版)
-
转行做IT-第5章 流程控制语句
-
2021-01-27
-
Qt之CTK(编译)
-
shiro触发doGetAuthorizationInfo方法的几种方式
-
计算机网络基础
-
kafka SASL_SSL发送消息
-
docker的应用
-
运动原子和场相互作用模型中的量子关联
-
element ui select选中问题
-
Mysql底层原理
-
Surface enhanced Raman scattering of gold nanoparticles aggregated by a gold-nanofilm-coated nanofiber
-
基于本振数字延时的合成孔径激光雷达信号相干性保持方法
-
Unity游戏开发之数字华容道
-
基于机器学习的P2P网络流问题的研究
-
async和await 实现同步请求
-
东南大学2013年935计算机专业基础考研真题与详解.rar
-
Leetcode 1123. 最深叶节点的最近公共祖先
-
Java无损导出及转换word文档
-
UE4游戏逆向与安全+FPS游戏逆向与安全
-
车载激光点云与序列化全景影像融合方法