繁体   English   中英

调用重载运算符 - >在编译时解决了吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM