Errori, bug, domande - pagina 1569

 
Ruslan Khasanov:
Perché appare "spazzatura" quando si usa uno styler?
E perché lo usa? ))
 

Errore di compilazione (build 1327)

class A { 
public:
        bool operator++( int ) { return false; }
};

void OnStart()
{
        A a;
        while ( a++ ); //'++' - illegal operation use
}
 

Errore di compilazione

class A { public:
template<typename T>        void f( T t );
template<typename T> static void g( T t );
}; 
template<typename T> void A::f( T t ) {}
template<typename T> void A::g( T t ) {}

void OnStart()
{
        A a;
        a.f(  1 ); //нормально
        A::g( 1 ); //'g<int>' - access to non-static member or function
}
 

Errore di compilazione

class A { public:
        A *operator ++()      { return &this; }
};
template<typename T> void f( T t ) {}
void g( A *a )
{
        f( ++a ); //'A' - declaration without type (1)
        f( a.operator++()); //нормально            (2)
}
Nota speciale - se si scambiano(!) le linee (1) e (2) va bene, il che richiede un ulteriore controllo
 
A100:

Errore di compilazione

Vorrei soprattutto notare che se si scambiano(!) le linee (1) e (2), tutto va bene, il che richiede un ulteriore controllo
Ho capito bene che f(++a) e f(a++) causano diverse varianti di f nel tuo esempio?
 
Anton Zverev:
Ho capito bene che f(++a) e f(a++) causano diverse varianti di f nel vostro campione?

No, questo è un errore di compilazione - cioè non è ancora arrivato all'esecuzione (chiamate specifiche). Le stringhe (1) e (2) sono equivalenti dal punto di vista del codice (scrittura diversa della stessa cosa)

Ecco un altro esempio per non dare l'impressione che si tratti solo dell'operatore ++

class A { public:
        A *operator <<( int )      { return &this; }
};
template<typename T> void f( T* t ) {}
void g( A* a )
{
        f( a << 1 ); //'A' - declaration without type
}
 
A100:

Le linee (1) e (2) sono equivalenti in termini di codice (scrittura diversa della stessa cosa)

++a e a++ hanno tuttavia un significato diverso. Non credete?
 
Anton Zverev:
++a e a++ sono, dopo tutto, di significato diverso. Non credete?
non c'è nessun a++
 

Errore di compilazione: errore di ottimizzazione dell'albero

#property library

class A { public:
template<typename T> int f( T a, int b, bool c = false );
};
template<typename T>
int A::f( T a, int b, bool c ) { return 0; }

class B : public A {
        virtual void g();
};
void B::g()
{
        f( 0, 0, false ); //нормально
        f( 0, 0 );        //tree optimization error
}

class C {};
void start( C* ) export {}

Poiché"l'errore di ottimizzazione dell'albero" non è facile da localizzare, chiedo agli sviluppatori (se hanno questa possibilità) di mettere tutte le ottimizzazioni nella chiave di ottimizzazione (grazie a Dio esiste), altrimenti anche con l'ottimizzazione disabilitata i programmi funzionanti risultano essere completamente disabilitati dopo l'aggiornamento della build (ed è impossibile tornare indietro).

Notate che tutti gli errori di oggi non sono vecchi, ma nuovi - prima (build 1241) tutto funzionava
 
A100:
non c'è nessun a++

Giusto. Ecco perché ho specificato

Anton Zverev:
Ho capito bene che f(++a) e f(a++) causano diverse varianti di f nel tuo esempio?
Motivazione: