我正在尝试为简单的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在“[]”之前执行。而我的猜测是“[]”应该先执行。这有什么特别的原因吗?或者只是因为“[]”在找到“]”时执行?
答案 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,()
的定义方式(以及COLUMN
和TYPE
宏的定义方式。)
答案 2 :(得分:2)
因为要调用operator[]
,它需要一个参数。它将括号内的内容视为带逗号的表达式,并使用operator,
获取一个结果来调用operator[]
。
答案 3 :(得分:1)
因为[]
运算符只接受一个参数,所以在评估[]
之前,它会等待评估{{1}}之间的整个表达式。
答案 4 :(得分:0)
看起来您使用operator,()
的结果作为operatot[]()
的参数,因此首先评估前者是合乎逻辑的,如f(g(x))
。
此外,在运行时没有“解析”任何内容。 C ++是编译的语言。