【一人 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 */
サポートコンパイラ
- GCC 8