File tree Expand file tree Collapse file tree 1 file changed +23
-5
lines changed Expand file tree Collapse file tree 1 file changed +23
-5
lines changed Original file line number Diff line number Diff line change @@ -378,7 +378,7 @@ auto const &getConstRef() { // std::string const &
378
378
379
379
### 真正的万能 ` decltype(auto) `
380
380
381
- 返回类型声明为 ` decltype(auto) ` 的效果等价于把返回类型替换为 ` decltype((返回表达式) ) ` :
381
+ 返回类型声明为 ` decltype(auto) ` 的效果等价于把返回类型替换为 ` decltype(返回操作数 ) ` :
382
382
383
383
``` cpp
384
384
int i;
@@ -387,22 +387,40 @@ decltype(auto) func() {
387
387
return i;
388
388
}
389
389
// 等价于:
390
- decltype((i) ) func() {
390
+ decltype(i ) func() {
391
391
return i;
392
392
}
393
393
// 等价于:
394
- int & func() {
394
+ int func() {
395
395
return i;
396
396
}
397
397
```
398
398
399
- > {{ icon.warn }} 注意 `decltype(i)` 是 `int` 而 `decltype((i))` 是 `int &`。这是因为 `decltype` 实际上有两个版本!当 `decltype` 中的内容只是单独的一个标识符(变量名)时,会得到变量定义时的类型;而当 `decltype` 中的内容不是单纯的变量名,而是一个复杂的表达式时,就会进入 `decltype` 的第二个版本:表达式版,会求表达式的类型,例如当变量为 `int` 时,表达式 `(i)` 的类型是左值引用,`int &`,而变量本身 `i` 的类型则是 `int`。此处加上 `()` 就是为了让 `decltype` 被迫进入“表达式”的那个版本,`decltype(auto)` 遵循的也是“表达式”这个版本的结果 。
399
+ 对于变量名,在 `return` 语句中加括号可以产生不同结果 。
400
400
401
401
```cpp
402
402
int i;
403
403
404
404
decltype(auto) func() {
405
- return i;
405
+ return (i);
406
+ }
407
+ // 等价于:
408
+ decltype((i)) func() {
409
+ return (i);
410
+ }
411
+ // 等价于:
412
+ int& func() {
413
+ return (i);
414
+ }
415
+ ```
416
+
417
+ > {{ icon.warn }} 注意 ` decltype(i) ` 是 ` int ` 而 ` decltype((i)) ` 是 ` int & ` 。这是因为 ` decltype ` 实际上有两个版本!当 ` decltype ` 中的内容只是单独的一个标识符(变量名)时,会得到变量定义时的类型;而当 ` decltype ` 中的内容不是单纯的变量名,而是一个复杂的表达式时,就会进入 ` decltype ` 的第二个版本:表达式版,会求表达式的类型,例如当变量为 ` int ` 时,表达式 ` (i) ` 的类型是左值引用,` int & ` ,而变量本身 ` i ` 的类型则是 ` int ` 。此处加上 ` () ` 使得 ` decltype ` 进入“表达式”的那个版本,` decltype(auto) ` 就会遵循“表达式”这个版本的结果。
418
+
419
+ ``` cpp
420
+ int i;
421
+
422
+ decltype (auto) func() {
423
+ return i + 1;
406
424
}
407
425
// 等价于:
408
426
decltype((i + 1)) func() {
You can’t perform that action at this time.
0 commit comments