Приоритет оператора при перегрузке - PullRequest
1 голос
/ 20 января 2011

Я пытаюсь создать скомпилированную модель C ++ для простых команд SQL.Например, это может быть частью моей основной функции, которую я должен уметь обрабатывать:

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

Так что для этого мне пришлось перегрузить операторы "[]" и ",".После этого я выяснил, что перегружатель "," выполняется перед "[]".В то время как я предполагаю, что «[]» должно быть выполнено первым.Есть ли какая-то конкретная причина, почему это происходит?Или это просто потому, что "[]" выполняется, когда "]" найден?

Ответы [ 5 ]

3 голосов
/ 20 января 2011

Ваше выражение будет скомпилировано в нечто вроде следующего, что может объяснить порядок оценки:

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).

3 голосов
/ 20 января 2011

Выражение внутри [] должно быть вычислено первым - оно должно быть передано как аргумент, поэтому вы видите, что operator, вызывается первым.

2 голосов
/ 20 января 2011

Потому что для вызова operator[] требуется один параметр. Он обрабатывает то, что внутри скобок, как выражение с запятыми и использует operator,, чтобы получить единственный результат, с помощью которого можно вызвать ваш operator[].

1 голос
/ 20 января 2011

Поскольку оператор [] принимает один аргумент, он ожидает, что будет вычислено все выражение между [], прежде чем сам будет вычислен.

0 голосов
/ 20 января 2011

Похоже, вы используете результат operator,() в качестве аргумента operatot[](), поэтому логично, что первое вычисляется первым, как в f(g(x)).

Кроме того, во время выполнения ничего не анализируется. C ++ - это скомпилированный язык.

...