【一人 C++20 Advent Calendar 2019】friend指定された関数内から構造化束縛を使用して非公開メンバ変数にアクセスすることを許可【4日目】

一人 C++20 Advent Calendar 2019 4日目の記事になります。

friend指定された関数内から構造化束縛を使用して非公開メンバ変数にアクセスすることを許可

C++17 では以下のように friend した関数内で構造化束縛を経由して private なメンバ変数にアクセスする事は出来ませんでした。

struct user{
    user(std::string const& name, int age)
        : name(name)
        , age(age){}

    friend void view(user const& u);
private:
    std::string name;
    int age;
};

void
view(user const& u) {
    // OK
    // friend 宣言しているのでこの関数内で private メンバ変数にアクセスできる
    auto name = u.name;
    auto age = u.age;

    // NG
    // firend 宣言されているが構造化束縛では参照できない
    auto [name2, age2] = u;

    std::cout << "name : " << name << std::endl;
    std::cout << "age : " << age << std::endl;
}

しかし、C++20 ではこの制限が緩和されて構造化束縛でもアクセスできるようになりました。

#include <iostream>

struct user{
    user(std::string const& name, int age)
        : name(name)
        , age(age){}

    friend void view(user const& u);
private:
    std::string name;
    int age;
};

void
view(user const& u) {
    // OK
    auto [name, age] = u;
    std::cout << "name : " << name << std::endl;
    std::cout << "age : " << age << std::endl;
}


int
main(){
    auto homu = user { "homu", 14 };
    view(homu);
    return 0;
}
/*
output:
name : homu
age : 14
*/

サポートコンパイラ

参照