С++ 17 std:: необязательная ошибка: ожидаемое первичное выражение перед 'auto'

Я экспериментировал с функцией С++ 17 std::optional.

Необязательный тип возвращаемого значения — std::optional<std::pair<int, int>>. Я вызываю функцию sum_pair в функции print_answer и хочу опциональную печать.

В функции print_answer я хотел проверить, содержит ли требуемая пара что-то для отображения. как в примере, приведенном в: фабричные функции с необязательным возвратом можно использовать в качестве условий while и if

Ниже приведен код: вот он работает с ошибкой

#include <iostream>
#include <vector>
#include <unordered_map>
#include <optional>

typedef std::optional<std::pair<int, int>> returnType;

// following algorithum works fine: just to show, 
// how I have used the std::optional
returnType sum_pair(const std::vector<int>& vec, const int sum)
{
    std::unordered_map<int, int> compIndexMap;

    int index = 0;
    for(const int& ele: vec)
    {
        if(auto check = compIndexMap.find(sum - ele); check != compIndexMap.cend())
            return returnType{std::make_pair(check->second, index)};

        compIndexMap.emplace(sum - ele, index);
        ++index;
    }
    return std::nullopt;
}

// problem is here:
void print_answer(const std::vector<int>& vec, const int sum)
{
    // if I uncomment the if-else, everything works
    /*if*/(auto Pair = sum_pair(vec, sum) )?  
        std::cout << "Resulting indexes are: " << Pair->first << " " << Pair->second << std::endl: //;
    //else
        std::cout << "Nothing found!\n";
}
int main()
{
    std::vector<int> vec0{ 1,3,2,8 };
    const int sum = 8;
    print_answer(vec0, sum);
    return 0;
}

Когда я использую оператор if-else в следующем формате

(condion) ? print something: print something else;

Я получаю следующие две ошибки. (используется GCC 7.1)

||=== Build: Debug in MyTestProgram (compiler: GNU GCC Compiler) ===|
|25|error: expected primary-expression before 'auto'|
|25|error: expected ')' before 'auto'|

Может кто-нибудь объяснить, почему мне нужно использовать if-else, но не с "оператором?"?


person Const    schedule 15.07.2018    source источник
comment
auto anything = something не является допустимым выражением. Это объявление, а объявления не являются допустимыми выражениями. И тернарное выражение не является оператором if-else.   -  person n. 1.8e9-where's-my-share m.    schedule 15.07.2018
comment
@н.м. извините не понял вашу мысль. Как же тогда работает это?   -  person Const    schedule 15.07.2018
comment
Дай мне попробовать снова. А <я>? оператор не является оператором if-else, и не все, что допустимо в последнем, приемлемо в первом.   -  person n. 1.8e9-where's-my-share m.    schedule 15.07.2018
comment
@Malayalam Вы ожидаете, что (int x = 17) ? x + 3 : x + 5 скомпилируется?   -  person 1201ProgramAlarm    schedule 15.07.2018


Ответы (1)


if(auto Pair = sum_pair(vec, sum) )
    std::cout << "Resulting indexes are: " << Pair->first << " " << Pair->second << std::endl;
else
    std::cout << "Nothing found!\n";

это действительный С++. Вы можете поместить объявление в условие открытия предложения if.

(auto Pair = sum_pair(vec, sum) )?
    std::cout << "Resulting indexes are: " << Pair->first << " " << Pair->second << std::endl
:
    std::cout << "Nothing found!\n";

это недопустимый С++. Объявления не являются выражениями. Есть места, где разрешены выражения, но нет объявлений. Левая часть ?, тройной оператор, является одним из них.

person Yakk - Adam Nevraumont    schedule 15.07.2018