![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
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.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
реклама |