What are the types of identifiers introduced by structured bindings in C++17?

前端 未结 2 619
小蘑菇
小蘑菇 2021-01-11 16:05

To my knowledge, identifiers introduced by structured bindings in C++17 are in fact references to some \"hidden\" variable. Such that

auto [ a, b ] = std::ma         


        
2条回答
  •  暗喜
    暗喜 (楼主)
    2021-01-11 16:53

    if I print out std::is_reference::value, I get 0 in the first case 1 in the second.

    Why is that even if we can prove that a and b refer to the elements in the tuple and one can modify those values by means of them?
    I'm not a language lawyer, but probably it is due to this bullet of the standard (working draft):

    if e is an unparenthesized id-expression naming a structured binding [...], decltype(e) is the referenced type as given in the specification of the structured binding declaration


    Side note. You should use this form to do so that a and b refer to the elements in the tuple:

    auto tup = std::make_tuple(1, 2);
    auto & [ a, b ] = tup;
    

    It follows a minimal, working example:

    #include 
    #include 
    #include 
    
    int main() {
        auto tup = std::make_tuple(1, 2);
        auto & [ a, b ] = tup;
        a = 0;
        std::cout << a << ", " << std::get<0>(tup) << std::endl;
    }
    

    See it on Coliru. On the other side, what you get is a copy of the values using the expression below:

    auto [ a, b ] = std::make_tuple(1, 2);
    

    Here is an article that explains it better and is a bit more comprehensible than the standard for humans.

提交回复
热议问题