Определение переменных в управляющих структурах - PullRequest
0 голосов
/ 24 сентября 2011

Согласно стандарту, какова разница в поведении между объявлением переменных в управляющих структурах и объявлением переменных в других местах?Я не могу найти упоминания об этом.

Если то, о чем я говорю, неясно, вот пример:

if (std::shared_ptr<Object> obj = objWeakPtr.lock())

Как видите, я объявляю и инициализирую локальную переменную, obj,в блоке if.

Кроме того, есть ли какие-либо технические причины, по которым этот синтаксис не имеет какого-либо особого поведения при использовании вместо условного выражения?Например, добавление дополнительного набора скобок приводит к ошибке компилятора;это также предотвращает связывание переменной с другими условиями.

// Extra brackets, won't compile.
if ((std::shared_ptr<Object> obj = objWeakPtr.lock()))

// If the above were valid, something like this could be desirable.
if ((std::shared_ptr<Object> obj = objWeakPtr.lock()) && obj->someCondition())

Ответы [ 2 ]

3 голосов
/ 24 сентября 2011

Согласно стандарту, какова разница в поведении между объявлением переменных в управляющих структурах и объявлением переменных в других местах?Я не могу найти упоминания об этом.

Объявления внутри представлений структуры управления ничем не отличаются от объявлений в других местах.Вот почему вы не можете найти никаких отличий.

6.4 / 3 описывает некоторую специфическую семантику для этого, но нет никаких сюрпризов:

[n3290: 6.4/3]: Имя, представленноеобъявление в условии (либо введенное type-specier-seq или декларатором условия) находится в области действия с момента его объявления до конца подсостояний, контролируемых условием.Если имя повторно объявлено в самом внешнем блоке подстанции, контролируемой условием, объявление, которое повторно объявляет имя, является неправильно сформированным.[..]


Кроме того, есть ли техническая причина того, почему этот синтаксис не имеет какого-либо особого поведения при использовании вместо условного выражения?Например, добавление дополнительного набора скобок приводит к ошибке компилятора;это также предотвращает связывание переменной с другими условиями.

Условие if может содержать или декларативное выражение или выражение.Ни одно выражение не может содержать декларативный оператор, поэтому вы также не можете смешивать их.

[n3290: 6.4/1]: Операторы выбора выбирают один из нескольких потоков управления.

selection-statement:
    if ( condition ) statement
    if ( condition ) statement else statement
    switch ( condition ) statement
condition:
    expression
    attribute-specifier-seq[opt] decl-specifier-seq declarator = initializer-clause
    attribute-specifier-seq[opt] decl-specifier-seq declarator braced-init-list

Все это просто следует из грамматических произведений.

0 голосов
/ 24 сентября 2011

Отличие от объявления и инициализации переменной в условии и объявления ее в другом месте состоит в том, что переменная используется в качестве условия и находится в области видимости внутри условного оператора if, но вне области действия вне этого условия. Также недопустимо повторно объявлять переменную внутри условия if. Так

bool x=something();
if(x) {
    bool y=x; // legal, x in scope
    int x=3; // legal
    ...
}
while (x=something_else()) // legal, x still in scope
...

но:

if(bool x=something()) 
    bool y=x; // still legal
    int x=3; // not legal to redeclare
    ...
}
while (x=something_else()) // x declared in condition not in scope any more
...