Fehler, Irrtümer, Fragen - Seite 1691

 
Code-Erstellungsfehler
void OnStart()
{
  int a = {0}; // code generation error
}
 
Andrey Dik:

Welche Spread-Werte erzeugt die FunktionCopySpread() für die entsprechende Diagrammperiode?

Es ist nicht klar, ob es sich um den Durchschnitt, das Minimum oder das Maximum handelt, und die Hilfe der Funktion sagt nichts darüber aus.

 
Andrey Dik:

Welche Spread-Werte erzeugt die FunktionCopySpread() für die entsprechende Diagrammperiode?

Es ist nicht klar, ob es sich um den Durchschnitt, das Minimum oder das Maximum handelt, und die Hilfe der Funktion sagt nichts darüber aus.

Wo, im Konto oder im Prüfgerät
 
Alexander Bereznyak:
wo, im Konto oder im Prüfer
beides ist in der Referenz nicht enthalten.
 

Zweideutiger Aufruf einer überladenen Funktion mit denselben Parametern

class A
{
public:  
//  void func( const int ) const {} // если заменить на это - будет компилироваться
  void func( const int ) {}

//  void func( const int& ) const {} // если заменить на это - будет компилироваться
  void func( const int& ) {}
};

void OnStart()
{
  A a;

  a.func(0);  

  int i1 = 0;
  a.func(i1);  

  const int i2 = 0;
  a.func(i2); // 'func' - ambiguous call to overloaded function with the same parameters  
}

Ist dies ein Missverständnis oder ein Fehler?

 
fxsaber:

Liegt es an meinem Missverständnis oder an einem Fehler?

Nach meinem Verständnis sollte sich dieser Code in beiden Fällen gleich verhalten.
 
fxsaber:

Zweideutiger Aufruf einer überladenen Funktion mit denselben Parametern

Ist dies ein Missverständnis oder ein Fehler?

Mißverständnis.

Nun, das war's, ich habe sie beantwortet. ))))

 
Комбинатор:
Nach meinem Verständnis muss sich dieser Code in beiden Fällen gleich verhalten.

Das ist auch meine Meinung.

Sergei Vladimirov:

Mißverständnis.

Nun, das war's, ich habe geantwortet. ))))

Die Erstellung dieses blöden Quellcode-Beispiels hat viel Zeit in Anspruch genommen. Mein Sinn für Humor verschwand fast, während ich es erstellte.

 
fxsaber:

Die Erstellung dieses stummen Beispiels hat viel Zeit in Anspruch genommen. Mein Sinn für Humor verschwand fast, während ich es erstellte.

(lacht) Okay. )

In allen drei Versionen des Aufrufs ist es unmöglich zu verstehen, ob das Argument als Wert oder als Referenz übergeben wird, so dass der Compiler nicht entscheiden kann, welche Funktion er aufrufen soll. Und der Modifikator const überlädt sie: void f(){} und void f() const {} sind unterschiedliche Funktionen. Wenn Sie in Ihrem Beispiel eine der Methoden als const deklarieren, verschwindet die Unsicherheit: Der Compiler wählt die gewünschte Methode aus, je nachdem, ob der Aufruf von einem konstanten Objekt aus erfolgt oder nicht (die Art des Arguments in Ihrem Beispiel spielt keine Rolle).

Ihr Objekt a ist keine Konstante, also wird die Methode ohne const alle drei Male aufgerufen. Wenn Sie ein Objekt als konstant deklarieren (A const a;), dann wird eine konstante Methode aufgerufen.

Sehen Sie sich das Ergebnis an:

class A
{
public:  
  void func() {Print("Non const");}
  void func() const {Print("Const");}
};

void OnStart()
{
        A a;
        A const b;
        
        a.func();
        b.func();
}
 
Sergei Vladimirov:

Gut. )

In allen drei Varianten des Aufrufs ist es unmöglich zu erkennen, ob ein Argument als Wert oder als Referenz übergeben wird, weshalb der Compiler nicht entscheiden kann, welche Funktion aufgerufen werden soll. Und der Modifikator const überlädt sie: void f(){} und void f() const {} sind unterschiedliche Funktionen. Wenn Sie in Ihrem Beispiel eine der Methoden als const deklarieren, verschwindet die Unsicherheit: Der Compiler wählt die gewünschte Methode aus, je nachdem, ob der Aufruf von einem konstanten Objekt aus erfolgt oder nicht (die Art des Arguments in Ihrem Beispiel spielt keine Rolle).

Ihr Objekt a ist keine Konstante, also wird die Methode ohne const alle drei Male aufgerufen. Wenn Sie das Objekt als konstant deklarieren (A const a;), wird die konstante Methode aufgerufen.

Du hättest es zuerst machen müssen. Der Fehler ist NUR hier
const int i2 = 0;
a.func(i2); // 'func' - ambiguous call to overloaded function with the same parameters

Alle Anrufe, die davor getätigt wurden, werden ohne Probleme angenommen.

Sehen Sie, was er ausdruckt:

Dies stammt aus einem anderen Thema.