hasherfrog
28-09-2006, 14:32
Тут забавный такой момент был...
Класс (пусть будет class A) использовал для доступа к массиву своих данных int& A::operator(int, ...). Всё работало, но у класса были ещё несколько конструкторов вида A::A(int i, int j), A::A(int i, int j, int k), плюс это был шаблон класса... В общем, решили "сумничать", повысить читаемость кода. Ну и заменили "()" на "[]" :-) Потом, конечно, пришлось всё возвращать обратно, так как оператор индексирования работает только с одним параметром. Но вот что интересно...
Когда мы писали так:class A {
public:
A(int, int);
int& operator[](int, int);
};, компилятор (gcc v3.3.3) ругался ошибкой. А когда написали так:class A {
public:
A(int, int);
int& operator[](int, ...);
};, стал ругатся лишь предупреждением!
Вопрос такой теперь мучает. А насколько вообще корректно писать operator[](int, ...), если известно (точно), что все "передаваемые" при вызове аргументы попросту игнорируются компилятором. Может, это всё-таки _ошибка_ должна быть?
И второй вопрос :] А куда деваются параметры при вызове { A a(0,0); a[1, 2, 3, 4]; }, например? Никто не видел сгенерированный assm-текст для подобного? Или "1,2,3,4" интерпретируются как последовательность операторов через запятую?
Класс (пусть будет class A) использовал для доступа к массиву своих данных int& A::operator(int, ...). Всё работало, но у класса были ещё несколько конструкторов вида A::A(int i, int j), A::A(int i, int j, int k), плюс это был шаблон класса... В общем, решили "сумничать", повысить читаемость кода. Ну и заменили "()" на "[]" :-) Потом, конечно, пришлось всё возвращать обратно, так как оператор индексирования работает только с одним параметром. Но вот что интересно...
Когда мы писали так:class A {
public:
A(int, int);
int& operator[](int, int);
};, компилятор (gcc v3.3.3) ругался ошибкой. А когда написали так:class A {
public:
A(int, int);
int& operator[](int, ...);
};, стал ругатся лишь предупреждением!
Вопрос такой теперь мучает. А насколько вообще корректно писать operator[](int, ...), если известно (точно), что все "передаваемые" при вызове аргументы попросту игнорируются компилятором. Может, это всё-таки _ошибка_ должна быть?
И второй вопрос :] А куда деваются параметры при вызове { A a(0,0); a[1, 2, 3, 4]; }, например? Никто не видел сгенерированный assm-текст для подобного? Или "1,2,3,4" интерпретируются как последовательность операторов через запятую?