Ошибки, баги, вопросы - страница 1749

A100:

Контроль скорее выборочный, а значит более противоречивый, что следует отсюда

class A {
public:
        void f( int ) const {} /*(1)*/        
        void f( int )       {} /*(2)*/
};
class B : public A {
public:
        void f( int ) const {} /*(3)*/
};
void OnStart()
{
        B b; //не const B
        b.f( 0 ); //(*)

}
Здесь в (*) по совокупности (с учетом не const B b ) больше подходит вызов A::f/*(2)*/

Но С++ всегда не анализирует базовый класс на более подходящий метод, если в производном есть просто подходящий.

А MQL - в предыдущем примере анализировал базовый класс на более подходящий метод, а в этом - не анализирует (здесь также как и С++ вызовет B::f/*(3)*/), а значит - нет единого подхода

Еще пример противоречивого контроля: C++ находит следующий код

class A { public:
        void f(  int i ) const {}
        void f( uint i )       {}
};
void OnStart()
{
        A a;
        a.f((int)0 );
}
ошибочным, а MQL - добротным
у вас компилятор под C++ какой? у меня gcc и все проходит без ошибок
coderex:
у вас компилятор под C++ какой? у меня gcc и все проходит без ошибок
И какую же функцию gcc вызывает в итоге? 
class A { public:
        void f(          int i ) const {} //1
        void f( unsigned int i )       {} //2
};
void OnStart()
{
        A a;
        a.f((int)0 );
}

(1) или (2). Сейчас вставлю сообщение компилятора

 

Вот это действительно - строгий контроль: один метод больше подходит по сигнатуре, другой - по константности

A100:

Вот это действительно - строгий контроль: один метод больше подходит по сигнатуре, другой - по константности

Ну если сделать const A a;, то (1) должен вызываться. Если нет - то на усмотрение компилятора. Т.е. однозначности быть не может. И не ясно, зачем такое писать.
fxsaber:
 И не ясно, зачем такое писать.

Замените f -> operator[], возьмите свой недавний пример - подумайте как сделать [] и слева и справа. Добавьте константности по вкусу - далее заверните в шаблон и у Вас получится нечто похожее

Если сделать const - рассматривается вариант без если

Если однозначности быть не может, то следует выдать как минимум предупреждение 

A100:
Замените f -> operator[], возьмите свой недавний пример - подумайте как сделать [] и слева и справа. Добавьте константности по вкусу - далее заверните в шаблон и у Вас получится нечто похожее
О каком примере речь? Могли бы Вы привести не исходник, а конечную запись, которая должна работать?
fxsaber:
О каком примере речь? Могли бы Вы привести не исходник, а конечную запись, которая должна работать?

В итоге должно получиться что то вроде этого

void OnStart()
{
        A<int> a;
        int b  = a[ 0 ];
        a[ 0 ] = a[ 1 ];
        a[ 1 ] = b;
}
A100:

В итоге должно получиться что то вроде этого

void OnStart()
{
        A<int> a;
        int b  = a[ 0 ];
        a[ 0 ] = a[ 1 ];
        a[ 1 ] = b;
}
Индексы константные?
fxsaber:
Индексы константные?

индексы числовые: 1 2 3 ... подразумевается что на месте A<int> может быть и const A<int>

A100:

индексы числовые: 1 2 3 ... подразумевается что на месте A<int> может быть и const A<int>

В этом случае a[ 0 ] = a[ 1 ]; должно выдавать ошибку?

fxsaber:
В этом случае a[ 0 ] = a[ 1 ]; должно выдавать ошибку?
Компилятор выдаст ошибку
void OnStart()
{
              A<int> a;
        const A<int> b;
        a[ 0 ] = b[ 0 ]; //нормально
        b[ 1 ] = a[ 2 ]; //ошибка
}