Инициализация оператора if существовала до C ++ 17? - PullRequest
0 голосов
/ 08 октября 2018

Случайно был найден следующий код:

if (bool result = f()) {
    // Do the stuff
}

Он был скомпилирован с gcc 4.9.2 и MSVS 2013.

Следующий код компилирует и печатает False!:

#include <iostream>

bool foo() {
    return false;
}

void bar() {
    if (bool result = foo()) {
        std::cout << "True!\n";
    } else {
        std::cout << "False!\n";
    }
}

int main()
{
    bar();

    return 0;
}

Я думал, что эта (кроме синтаксиса) функциональность доступна только с C++17.

Я правильно понимаю?

Ответы [ 4 ]

0 голосов
/ 08 октября 2018

c ++ 17 также допускает эту потенциально запутанную конструкцию:

int bar();
bool query();
void foo(int, bool);

int main()
{
    if (int x = bar() ; bool y = query())
    {
        foo(x, y);
    }
    else
    {
        foo(x * 2, y);
    }
}
0 голосов
/ 08 октября 2018

Синтаксис в c ++ 17 отличается:

if(int foo = result(); foo == 1)

Новая нотация сначала объявляет переменную, а затем проверяет ее.Это исправляет проблему присваивания и условия теста в том же утверждении, что может привести к ошибкам.

0 голосов
/ 08 октября 2018

Да.В c ++ 17 мы можем инициализировать и затем проверить условие в операторе if.

Пример:

 if( bool result = foo(); result ) {
    std::cout << "True!\n";
 } else {
    std::cout << "False!\n";
 }

Это помогает нам написать более понятный код, если область действия переменной равнапросто ограничено оператором if.

Выше будет выглядеть аккуратно, чем

 bool result = foo();
 if( result ) {
    std::cout << "True!\n";
 } else {
    std::cout << "False!\n";
 }
0 голосов
/ 08 октября 2018

Я правильно понял?

Юп.Всегда было разрешено иметь объявление в условии оператора if.Что нового в C ++ 17, так это то, что вы можете иметь инициализатор и условие:

if (int A = 0; ++A == 1);
//  ^^^^^^^^^
//  new part

Для тех, кто спрашивает, почему это полезная функция, вот пример, который мне нравится из Reddit:

std::map<int, std::string> Map;
// ...

if (auto[it, inserted] = Map.insert(std::pair(10, "10")); inserted)
    ; // do something with *it.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...