C++17 std::optional error: expected primary-expres

2020-02-07 10:20发布

I was experimenting with C++17 feature std::optional

The optional return type is std::optional<std::pair<int, int>>. I call the sum_pair function in print_answer function and wanted a optional print.

In print_answer function I wanted to check whether the required pair holds something to show. like in the example given in: optional-returning factory functions are usable as conditions of while and if

Following is the code: here is it live with error

#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;
}

When I use the if-else statement in the following format

(condion) ? print something: print something else;

I get the following two errors. (used GCC 7.1)

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

Can somebody explain, why I need to use if-else, but not with "operator ?" ?

1条回答
老娘就宠你
2楼-- · 2020-02-07 10:52
if(auto Pair = sum_pair(vec, sum) )
    std::cout << "Resulting indexes are: " << Pair->first << " " << Pair->second << std::endl;
else
    std::cout << "Nothing found!\n";

this is valid C++. You are allowed to put a declaration in the opening condition of an if clause.

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

this is not valid C++. Declarations are not expressions. There are places where expressions are allowed, but declararions are not. The left hand side of ?, the trinary operator, is one of them.

查看更多
登录 后发表回答