gpt4 book ai didi

c++ - 我相信这是 clang++ 中与访问类的公共(public)成员函数相关的错误

转载 作者:可可西里 更新时间:2023-11-01 15:46:22 24 4
gpt4 key购买 nike

以下doesn't compile在 clang 中:

#include <iostream>

void f() { std::cout << "f()\n"; }

struct S {
typedef void(*p)();
operator p() { return f; }
};

int main()
{
S s;
s.operator p()();
}

产量:

main.cpp:13:16: error: unknown type name 'p'; did you mean 'S::p'?
s.operator p()();
^
S::p

main.cpp:6:19: note: 'S::p' declared here
typedef void(*p)();
^

但它应该,因为表达式 s.operator p()() 访问对象 S::s 的公共(public)成员函数。我错过了什么吗?

如果我错了,我将不胜感激标准中的引述来支持答案。

最佳答案

这似乎是 Clang 中的一个错误。我相信代码是正确的。

Clang 4.0.0 报告:

<source>:13:16: error: unknown type name 'p'; did you mean 'S::p'?
s.operator p()();
^

但是,从 C++14 3.4.5/7 [basic.lookup.classref] 开始

If the id-expression is a conversion-function-id, its conversion-type-id is first looked up in the class of the object expression and the name, if found, is used. Otherwise it is looked up in the context of the entire postfix-expression. In each of these lookups, only names that denote types or templates whose specializations are types are considered.

[ Example:

struct A { };
namespace N {
struct A {
void g() { }
template <class T> operator T();
};
}


int main() {
N::A a;
a.operator A();
// calls N::A::operator N::A
}

— end example ]

在您的示例中,类型 p 应该无需限定即可在类中找到。

关于c++ - 我相信这是 clang++ 中与访问类的公共(public)成员函数相关的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44475056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com