运算符优先级重载

时间:2011-01-20 17:56:52

标签: c++ operator-overloading operator-precedence

我正在尝试为简单的SQL命令创建一个C ++编译模型。例如,这可能是我必须能够处理的主要功能的一部分:

CREATE_TABLE(books) [             // create("books");ovr[
    COLUMN(c1) TYPE(string),      // "title string",
    COLUMN(c2) TYPE(string),      // "author string",
    COLUMN(num1) TYPE(int)        // "price int"
                    ];

所以为了做到这一点,我不得不重载“[]”和“,”运算符。在这样做之后,我发现“,”overloader在“[]”之前执行。而我的猜测是“[]”应该先执行。这有什么特别的原因吗?或者只是因为“[]”在找到“]”时执行?

5 个答案:

答案 0 :(得分:3)

必须首先评估[]中的表达式 - 它需要作为参数传入,这就是为什么你看到首先调用operator,的原因。

答案 1 :(得分:3)

您的表达式将编译为以下内容,这可能会解释评估顺序:

CREATE_TABLE(books).operator[](
    COLUMN(c1) TYPE(string).operator,(
        COLUMN(c2) TYPE(string).operator,(
            COLUMN(num1) TYPE(int) 
        )
    )
);

CREATE_TABLE(books).operator[](
    operator,( COLUMN(c1) TYPE(string), 
        operator,( COLUMN(c2) TYPE(string), COLUMN(num1) TYPE(int))
    )
);

取决于您operator,()的定义方式(以及COLUMNTYPE宏的定义方式。)

答案 2 :(得分:2)

因为要调用operator[],它需要一个参数。它将括号内的内容视为带逗号的表达式,并使用operator,获取一个结果来调用operator[]

答案 3 :(得分:1)

因为[]运算符只接受一个参数,所以在评估[]之前,它会等待评估{{1}}之间的整个表达式。

答案 4 :(得分:0)

看起来您使用operator,()的结果作为operatot[]()的参数,因此首先评估前者是合乎逻辑的,如f(g(x))

此外,在运行时没有“解析”任何内容。 C ++是编译的语言。