[英]`friend struct std::is_invocable` can't access private members of class it is friend to
我已使struct std::is_invocable
成為class D
的friend
,但它無法訪問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.