[英]Is calling of overload operator-> resolved at compile time?
当我尝试编译代码时:(注意:func和func2不是拼写错误)
struct S
{
void func2() {}
};
class O
{
public:
inline S* operator->() const;
private:
S* ses;
};
inline S* O::operator->() const
{
return ses;
}
int main()
{
O object;
object->func();
return 0;
}
报告编译错误:
D:\code>g++ operatorp.cpp -S -o operatorp.exe
operatorp.cpp: In function `int main()':
operatorp.cpp:27: error: 'struct S' has no member named 'func'
看来调用“operator->”的重载函数是在编译期间完成的吗? 我添加了“-S”选项仅用于编译。
是的,它被视为普通的函数调用,它只是由重载的运算符调用。 编译器在编译时检查一切是否有效。 如果p->mynonexistantfunction()
是函数的有效名称,C ++就不会像动态语言一样等到运行时才能运行,如果函数名不存在,编译器将在编译时拒绝代码。
在这种情况下,它看起来像一个拼写错误,S有一个函数func2()
但你的代码调用func()
。
在struct S中,您声明了func2(),但在main中,您尝试调用func()。
try int main() { O object; object->func2(); return 0; }
int main() { O object; object->func2(); return 0; }
是的,编译器通过它的结果检查运算符作为任何其他函数。
在这种情况下,如果你有,例如,
S* foo() { ... }
(foo())->func();
结果会是一样的。
在C ++语言中,您无法在运行时按名称选择类成员。 类成员选择(通过直接成员名称)始终在编译时完成。 没有办法绕过它。
如果要在运行时实现成员选择,则唯一可以使用的是运算符.*
和->*
(前者 - 不可重载)。 但是,这些内置形式的运算符需要将指针指向成员作为右手操作数。 如果你想按名称选择一些东西(作为一个字符串)你可以重载->*
使它采用不同的参数类型,但无论如何你必须手动实现从字符串到实际成员的映射。 但是,对于成员函数(与数据成员相对),这通常非常棘手。
object->func()
只是用于用户定义类型的object->operator->()->func()
语法糖。 由于O::operator->()
产生S*
,因此在编译时需要存在方法S::func()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.