#cpp #cpp17
Требуется задать переменную, ограниченную областью видимости условного оператора if или switch. Как это можно сделать?
Ответы
Ответ 1
В С++ изначально была возможность объявлять переменные в условиях. В C++ 11 эти возможности были расширены введением понятия контекстуального преобразования и возможностью использовать список инициализации в фигурных скобках. Согласно стандарту C++ (6.4 Selection statement) 2 The rules for conditions apply both to selection-statements and to the for and while statements (6.5). The declarator shall not specify a function or an array. The decl-specifier-seq shall not define a class or enumeration. If the auto type-specifier appears in the decl-specifier-seq, the type of the identifier being declared is deduced from the initializer as described in 7.1.6.4. 3 A name introduced by a declaration in a condition (either introduced by the decl-specifier-seq orthedeclarator of the condition) is in scope from its point of declaration until the end of the substatements controlled by the condition. If the name is re-declared in the outermost block of a substatement controlled by the condition, the declaration that re-declares the name is ill-formed. 4 The value of a condition that is an initialized declaration in a statement other than a switch statement is the value of the declared variable contextually converted to bool (Clause 4). If that conversion is ill-formed, the programisill-formed. The value of a condition that is an initialized declaration in a switch statement is the value of the declared variable if it has integral or enumeration type, or of that variable implicitly converted to integral or enumeration type otherwise. The value of a condition that is an expression is the value of the expression, contextually converted to bool for statements other than switch; if that conversion is ill-formed, the program is ill-formed. The value of the condition will be referred to as simply “the condition” where the usage is unambiguous. То есть вместо выражений в условиях таких предложений как if, switch, for, while можно включать объекление переиенной, у которой имеется инициализатор. В предложениях if, for, while значение объявленной переменной контекстуально преобразуется в тип bool , и это значение используется в качестве значения условия. Вы не можете в качестве объявлений в этих предложениях использовать объявления массивов или функций, а также определять классы или перечисления. Для switch предложения объявленная переменная должна иметь целочисленный тип или тип перечисления, или иметь возможность быть неявно преобразованной к этим типам. Вот пример объявление переменной в условии предложения if #include#include class A { private: std::string s; public: explicit A( const std::string &s ) : s( s ) { } explicit operator bool() const { return s == "Hi"; } void hi() { std::cout << "I'm glad to see you" << std::endl; } void bye() { std::cout << "See you latter" << std::endl; } }; int main() { if ( A a { "Hi" } ) { a.hi(); } else { a.bye(); } if ( A a { "Bye" } ) { a.hi(); } else { a.bye(); } } Вывод на консоль I'm glad to see you See you latter В этом примере объявляется класс, у которого имеется явный оператор преобразования к типу bool. Поэтому в условии предложения If выможете объявить объект класса, которыфй благодаря этому оператору будет преобразован к значению типа bool. Этот объект будет ограничен областью видимости оператора if. Ответ 2
В c++17 появилась возможность задавать объявление переменной прямо в условном операторе if или switch. Например: if (int i = 42; cond) { ... } switch (SomeType t; var) { ... } Ключевой момент здесь в том, что ветвление выполняется по cond или var, а не по i или t. До c++17 для этих целей приходилось вводить новый блок через { } и выглядело это не очень красиво: { int i = 42; if (cond) { ... } } Новый синтаксис имитирует именно такой подход.
Комментариев нет:
Отправить комментарий