![]() |
![]() ![]() ![]() ![]() |
![]() |
letBoost , Chapter 1. Phoenix 3.2.0 , Scope
|
|||||||||
![]() |
Note |
|---|---|
Вы можете установить< |
Пример:
let(_a = 123, _b = 456) [ _a + _b ]
Сохранение ссылок
Тип локальной переменной предполагает тип лямбда-выражения. Типовая дедукция - это сохранение ссылок. Например:
let(_a = arg1, _b = 456)
<_a>предполагает тип<arg1>: Ссылка на аргумент, в то время как<_b>имеет тип<int>.
Подумайте об этом:
int i = 1; let(_a = arg1) [ cout << --_a << ' ' ] (i); cout << i << endl;
Вывод выше: 0 0
Пока с этим:
int i = 1; let(_a = val(arg1)) [ cout << --_a << ' ' ] (i); cout << i << endl;
Результат: 0 1
Сохранение ссылок необходимо, потому что нам нужен доступ L-значения к внешним лямбда-скопам (особенно к аргументам).<arg>и<ref>являются L-значениями.<val>— R-значения.
Объем и продолжительность жизни локальных переменных ограничены внутри летающего тела.<let>Блоки могут быть вложены. Локальная переменная может скрывать внешнюю локальную переменную. Например:
let(_x = _1, _y = _2) [ // _x here is an int: 1 let(_x = _3) // hides the outer _x [ cout << _x << _y // prints "Hello, World" ] ](1," World","Hello,");
Фактические значения параметров _1, _2 и _3 приведены в скобках в конце<let>.
В настоящее время существует ограничение, что внутреннее<let>не может быть снабжено константой, например<let(_x=1)>.
RHS (ламбда-выражение правой стороны) каждой локальной декларации не может относиться к любому локальному идентификатору LHS. На данный момент локальные идентификаторы еще не находятся в области действия; они будут находиться только в области действия в летящем теле. Приведенный ниже код содержит ошибку:
let( _a = 1 , _b = _a // Error: _a is not in scope yet ) [ // _a and _b's scope starts here /*. body .*/ ]
Тем не менее, если внешний диапазон разрешений доступен, это будет искаться. Поскольку сфера действия RHS локальной декларации является внешней сферой, включающей пропуск, RHS локальной декларации может относиться к локальной переменной внешней сферы:
let(_a = 1) [ let( _a = _1 , _b = _a // Ok. _a refers to the outer _a ) [ /*. body .*/ ] ](1)
Статья let раздела Chapter 1. Phoenix 3.2.0 Scope может быть полезна для разработчиков на c++ и boost.
реклама |