簡體   English   中英

`friend struct std::is_invocable` 不能訪問它是朋友的類的私有成員

[英]`friend struct std::is_invocable` can't access private members of class it is friend to

我已使struct std::is_invocable成為class Dfriend ,但它無法訪問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' 中聲明的私有成員”

為什么std::is_invocable訪問D::sinx()

為什么std::is_invocable訪問D::sinx()

因為它沒有嘗試。 main正在嘗試訪問D::sinx 它不能。 請記住:可訪問性是關於誰可以使用成員的名稱 您在main中輸入了名稱“D::sinx”。 因此,嘗試訪問該名稱是main的。

所以你給了錯誤的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM