`friend struct std :: is_invocable`可以访问班级的私人成员,这是朋友

发布于 2025-02-06 15:58:58 字数 1993 浏览 3 评论 0原文

我已经制作struct std :: is_invocable 类D的朋友,但它无法访问d的私人成员。 GCC,Clang和MS Visual Studio 2017发生这种情况,因此这不是MSVC的怪癖之一。

#include <iostream>
#include <string>
#include <type_traits>
#include <iomanip>
#include <cmath>
using std::cin;
using std::cout;

const double PI = 3.1415926535898;

class A
{
public:
    A(double xx) : x(xx)
    {
        s = sin(x);
    }
    
    double sinx()
    {
        return s;
    }
    
private:
    double x;
    double s;
};

class B
{
public:
    double sinx(double x)
    {
        return sin(x);
    }
};

class C
{
public:
    static double sinx(double x)
    {
        return sin(x);
    }
};

class D
{
private:
    double sinx(double x)
    {
        return sin(x);
    }
    
public:
    template<class T, class... Args>
    friend struct std::is_invocable;
};

class E
{
public:
    double sinx;
};

int main()
{
    std::string s;
    A a0(PI/2.);
    
    cout << std::boolalpha;
    cout << std::is_invocable<decltype(&A::sinx), A&>::value << "\n";
    cout << std::is_invocable<decltype(&B::sinx), B&, const double>::value << "\n";
    cout << std::is_invocable<decltype(&B::sinx), const double>::value << "\n";
    cout << std::is_invocable<decltype(&C::sinx), const double>::value << "\n";
    cout << std::is_invocable<decltype(&D::sinx), D&, const double>::value << "\n";  // shouldn't this compile if 
                                                                                     // std::is_invocable is friend?
    cout << std::is_invocable<decltype(&E::sinx), E&, const double>::value << "\n";
    
    cout << "Press ENTER to exit.\n";
    std::getline(cin, s);
}

错误是:

c2248“'d :: sinx':无法访问类'd''d'的私人成员

C2248

I have made struct std::is_invocable be a friend of class D, but it is unable to access the private member of D. This happens with gcc, clang, and MS Visual Studio 2017, so it is not one of MSVC's quirks.

#include <iostream>
#include <string>
#include <type_traits>
#include <iomanip>
#include <cmath>
using std::cin;
using std::cout;

const double PI = 3.1415926535898;

class A
{
public:
    A(double xx) : x(xx)
    {
        s = sin(x);
    }
    
    double sinx()
    {
        return s;
    }
    
private:
    double x;
    double s;
};

class B
{
public:
    double sinx(double x)
    {
        return sin(x);
    }
};

class C
{
public:
    static double sinx(double x)
    {
        return sin(x);
    }
};

class D
{
private:
    double sinx(double x)
    {
        return sin(x);
    }
    
public:
    template<class T, class... Args>
    friend struct std::is_invocable;
};

class E
{
public:
    double sinx;
};

int main()
{
    std::string s;
    A a0(PI/2.);
    
    cout << std::boolalpha;
    cout << std::is_invocable<decltype(&A::sinx), A&>::value << "\n";
    cout << std::is_invocable<decltype(&B::sinx), B&, const double>::value << "\n";
    cout << std::is_invocable<decltype(&B::sinx), const double>::value << "\n";
    cout << std::is_invocable<decltype(&C::sinx), const double>::value << "\n";
    cout << std::is_invocable<decltype(&D::sinx), D&, const double>::value << "\n";  // shouldn't this compile if 
                                                                                     // std::is_invocable is friend?
    cout << std::is_invocable<decltype(&E::sinx), E&, const double>::value << "\n";
    
    cout << "Press ENTER to exit.\n";
    std::getline(cin, s);
}

The error is:

C2248 "'D::sinx': cannot access private member declared in class 'D'"

Why can't std::is_invocable access D::sinx()?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

最好是你 2025-02-13 15:58:58

为什么不能std :: is_invocable访问d :: sinx()

因为它不是试图的。 MAIN正在尝试访问d :: Sinx。它不能。请记住:可访问性是关于谁可以使用会员的名称。您在main中键入“ D :: Sinx”的名称。因此,试图访问名称的是main

因此,您可以访问错误的事情。

Why can't std::is_invocable access D::sinx() ?

Because it isn't trying to. main is trying to access D::sinx. Which it can't. Remember: accessibility is about who can use the name of the member. You typed the name "D::sinx" in main. Therefore, it is main that is trying to access the name.

So you're giving access to the wrong thing.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文