zuweisung von literal an short
-
ich merke gerade, dass ich das problem falsch dargestellt habe. die warnung kommt nicht bei *jeder* zuweisung. ein beispiel:
std::pair<short, short> foo = std::make_pair(42, 23); // Warning: implicit arithmetic conversion from 'int' to 'short' std::pair<short, short> bar = std::make_pair(short(42), short(23)); // ok short baz = 12; // auch okHeinzelotto schrieb:
wieso sollte die zuweisung zur laufzeit geschehen, der wert (12) steht doch schon zur compilezeit fest.
vielleicht weil der compiler dumm ist?
-
Nein, in dem Fall ist die Warnung sehr korrekt. Ich bin ehrlich gesagt etwas erstaunt, dass der Code überhaupt funktioniert. Die STL ist noch besser, als ich es gedacht hatte ^^
std::make_pair(42, 23)liefert dir ein Objekt von Typstd::pair<int, int>zurück. Dieses wird dann demstd::pair<short, short>zugewiesen. Bei der Zuweisung kommt natürlich die Warnung, da der Compiler nicht mehr weiss, was in den Variablen steht.
Um das zu umgehen, könntest du vielleicht das hier machen:std::pair<short, short> foo = std::make_pair<short, short>(42, 23);Du gibst explizit an, dass du ein
std::pair<short, short>möchtest.Grüssli
-
Tachyon schrieb:
Fellhuhn schrieb:
Ich glaube es war nur ein Beispiel und bei der Zuweisung kann wohl auch eine Variable stehen. Vermute ich mal...
Naja, da er von einem Literal spricht, dann wird da keine Variable stehen dürfen.
Ha, und doch recht gehabt

-
das beispiel war jetzt aus der luft gegriffen, tatsächlich steht sowas da:
typedef TollesFramework::Vector2<short, short> Point2D; Point2D foo(23, 42);und dabei kommt die warnung. ich weiß gerade nicht, was das template intern so treibt, aber wahrscheinlich ist es ähnlich dem pair-beispiel. ich kann die warnung mit einfachen zuweisungen nicht reproduzieren.
-
jetzt hab ichs:
short foo = 23; short baz = foo + 42; // Warning: implicit conversion from 'int' to 'short'ist nicht normal, oder?
-
Doch. Denn bei einem binären Operator werden beide Operanden auf den höheren/größeren etc. gecastet. Das Ergebnis von short + int ist ein int.
-
und hat dann
bar = foo + short(42);irgendeinen nachteil, außer dass man mehr tippen muss?
-
msvc zeigt übrigens bei dem code auch in der höchsten warnstufe nix an, deshalb hats mich so gewundert...
-
und comeau mit --strict-warnings auch nicht...

-
ARMer progger schrieb:
und hat dann
bar = foo + short(42);irgendeinen nachteil, außer dass man mehr tippen muss?Es hat keinen Vorteil, weil es die entsprechende Warnung nicht unterdrücken dürfte. Denn auch das Ergebnis von
foo+short(42)
hat den Typ int
-
camper schrieb:
foo+short(42)
hat den Typ intich meinte ja auch
short(foo + 42), bin aber zu blöd das auch zu schreiben.