Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

let

Boost , Chapter 1. Phoenix 3.2.0 , Scope

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

let

#include <boost/phoenix/scope/let.hpp>

Вы объявляете локальные переменные, используя синтаксис:

let(local-declarations)
[
    let-body
]

<let>позволяет 1..N локальных переменных объявлений (где N ==<BOOST_PHOENIX_LOCAL_LIMIT>. Каждое заявление имеет следующую форму:

local-id = lambda-expression
[Note] Note

Вы можете установить<BOOST_PHOENIX_LOCAL_LIMIT>, предопределенные максимальные локальные переменные объявления в разрешенном выражении. По умолчанию<BOOST_PHOENIX_LOCAL_LIMIT>устанавливается на<BOOST_PHOENIX_LIMIT>.

Пример:

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)

PrevUpHomeNext

Статья let раздела Chapter 1. Phoenix 3.2.0 Scope может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Scope ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 21:28:08/0.028159856796265/1