Fehler, Irrtümer, Fragen - Seite 2006

 
fxsaber:

Warum sollten beide kompiliert werden?

Im Allgemeinen verwende ich Vorlagen selten - ich bin nicht ins Detail gegangen - ich kann nur intuitiv erklären

Im 2. Fall ist eine direkte Ersetzung von T durch A* gut kompilierbar - also sollte auch die Vorlage kompilierbar sein

class A {};
void f( A * const ) {}
void OnStart()
{
        A *a;
        f( a ); //нормально
}

Im 1. Fall funktioniert eine direkte Ersetzung nicht, aber Sie können den redundanten Parameter T2 hinzufügen - mit kompiliert er normal - so sollte er ohne ihn sein - deshalb ist er redundant

template<typename T, typename T2>
void f( T, const T2 ) {}
class A {};
void OnStart()
{
        const A *a;
        f( a, a ); //нормально
}
 
A100:

Intuitiv ist const manchmal Teil eines Typs und manchmal nur ein Bezeichner, so dass innerhalb der Funktion der Zeiger const sein wird.

Dies lässt sich durchPrint(__FUNCSIG__) erkennen;

 
Der Drawdown-Wert in der Optimierungstabelle wird seltsamerweise angezeigt. Sie zeigt den maximalen Drawdown nach Mitteln an (wird aber in Prozent angegeben). Aber nach einem einzigen Test stellt sich heraus, dass der relative Drawdown vom maximalen Drawdown abweicht (der Prozentsatz ist größer oder kleiner). Ist es bei der Geldverwaltung notwendig, etwas anderes hinzuzufügen, um die gewünschten Ergebnisse anzuzeigen?
 
A100:

Kompilierungsfehler

template<typename T>
void f( T, const T ) {}
class A {};
void OnStart()
{
        A * const a = new A;
        f( a, a ); //error: 'a' - cannot convert from const pointer to nonconst pointer
}
So wird es kompiliert, die Originalversion sollte es nicht.
 
Комбинатор:
So wird es kompiliert, die ursprüngliche Version sollte nicht kompiliert werden.

Und warum?

template<typename T>
struct B {
        void f( T, const T ) {}
};
class A {};
void OnStart()
{
          const A* a;
        B<const A*> b;
        b.f( a, a ); //нормально
}

Es ist also in Ordnung. Was hat sich im Prinzip geändert?

template<typename T>
        void f( T, const T ) {}
class A {};
void OnStart()
{
          const A *a;
          f( a, a ); //error: 'a' - cannot convert from const pointer to nonconst pointer
}
 
A100:

Was hat sich grundlegend geändert?

Der Unterschied ist gewaltig! Das ist es, was Sie gemeldet haben.

void B<const A*>::f(const A*,const A*)
Der Compiler hat einen Fehler in dem Sinne, dass er die richtige Version der Vorlage nicht herausfinden kann. Offensichtlich hat er das getan.
template<typename T>
        void f( T, const T ) {}
class A {};
void OnStart()
{
          const A *a;
          f<const A*>( a, a );
}

Und es funktioniert.

 
fxsaber:
Und es funktioniert.

Warum die zusätzlichen Zeichen?

 
A100:

Warum die zusätzlichen Zeichen?

Um zu zeigen, dass der Compiler nicht auf eine perfekt funktionierende Version des Musters schließen kann.

 
fxsaber:

Um zu zeigen, dass der Compiler nicht auf eine perfekt funktionierende Version des Musters kommt.

Warum sollte sie? ServiceDesk kann es selbst herausfinden

 
A100:

Und warum?

Nach Ihrer Spezialisierung zu urteilen, sollte der Typ const verworfen haben, was er auch tut. Wenn Sie explizit den richtigen Typ angeben, wird er natürlich kompiliert.