From 2f7066a939a9d08f250c36a525a0d5022a9ddc6c Mon Sep 17 00:00:00 2001 From: Anthony Calandra Date: Thu, 23 Aug 2018 22:17:56 -0400 Subject: [PATCH] Add sections for decltypes and improve descriptions. --- CPP11.md | 4 +++- CPP14.md | 4 +++- README.md | 8 ++++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/CPP11.md b/CPP11.md index 9ed23ff..5eb86f0 100644 --- a/CPP11.md +++ b/CPP11.md @@ -178,7 +178,7 @@ auto f3 = [x] () mutable { x = 2; }; // OK: the lambda can perform any operation ``` ### decltype -`decltype` is an operator which returns the _declared type_ of an expression passed to it. Examples of `decltype`: +`decltype` is an operator which returns the _declared type_ of an expression passed to it. cv-qualifiers and references are maintained if they are part of the expression. Examples of `decltype`: ```c++ int a = 1; // `a` is declared as type `int` decltype(a) b = a; // `decltype(a)` is `int` @@ -197,6 +197,8 @@ auto add(X x, Y y) -> decltype(x + y) { add(1, 2.0); // `decltype(x + y)` => `decltype(3.0)` => `double` ``` +See also: `decltype(auto)` (C++14). + ### Template aliases Semantically similar to using a `typedef` however, template aliases with `using` are easier to read and are compatible with templates. ```c++ diff --git a/CPP14.md b/CPP14.md index 6e80c6a..f4434a0 100644 --- a/CPP14.md +++ b/CPP14.md @@ -89,7 +89,7 @@ int& z = g(y); // reference to `y` ``` ### decltype(auto) -The `decltype(auto)` type-specifier also deduces a type like `auto` does. However, it deduces return types while keeping their references or "const-ness", while `auto` will not. +The `decltype(auto)` type-specifier also deduces a type like `auto` does. However, it deduces return types while keeping their references and cv-qualifiers, while `auto` will not. ```c++ const int x = 0; auto x1 = x; // int @@ -121,6 +121,8 @@ static_assert(std::is_same::value == 1); static_assert(std::is_same::value == 1); ``` +See also: `decltype` (C++11). + ### Relaxing constraints on constexpr functions In C++11, `constexpr` function bodies could only contain a very limited set of syntaxes, including (but not limited to): `typedef`s, `using`s, and a single `return` statement. In C++14, the set of allowable syntaxes expands greatly to include the most common syntax such as `if` statements, multiple `return`s, loops, etc. ```c++ diff --git a/README.md b/README.md index b584c57..20ee2bf 100644 --- a/README.md +++ b/README.md @@ -512,7 +512,7 @@ int& z = g(y); // reference to `y` ``` ### decltype(auto) -The `decltype(auto)` type-specifier also deduces a type like `auto` does. However, it deduces return types while keeping their references or "const-ness", while `auto` will not. +The `decltype(auto)` type-specifier also deduces a type like `auto` does. However, it deduces return types while keeping their references and cv-qualifiers, while `auto` will not. ```c++ const int x = 0; auto x1 = x; // int @@ -544,6 +544,8 @@ static_assert(std::is_same::value == 1); static_assert(std::is_same::value == 1); ``` +See also: [`decltype`](#decltype). + ### Relaxing constraints on constexpr functions In C++11, `constexpr` function bodies could only contain a very limited set of syntaxes, including (but not limited to): `typedef`s, `using`s, and a single `return` statement. In C++14, the set of allowable syntaxes expands greatly to include the most common syntax such as `if` statements, multiple `return`s, loops, etc. ```c++ @@ -743,7 +745,7 @@ auto f3 = [x] () mutable { x = 2; }; // OK: the lambda can perform any operation ``` ### decltype -`decltype` is an operator which returns the _declared type_ of an expression passed to it. Examples of `decltype`: +`decltype` is an operator which returns the _declared type_ of an expression passed to it. cv-qualifiers and references are maintained if they are part of the expression. Examples of `decltype`: ```c++ int a = 1; // `a` is declared as type `int` decltype(a) b = a; // `decltype(a)` is `int` @@ -762,6 +764,8 @@ auto add(X x, Y y) -> decltype(x + y) { add(1, 2.0); // `decltype(x + y)` => `decltype(3.0)` => `double` ``` +See also: [`decltype(auto)`](#decltypeauto). + ### Template aliases Semantically similar to using a `typedef` however, template aliases with `using` are easier to read and are compatible with templates. ```c++