| Autor |
Nachricht |
krümelkacker
Mitglied
Benutzerprofil
Anmeldungsdatum: 10.08.2010
Beiträge: 2223
|
krümelkacker Mitglied
19:19:36 09.08.2012 Titel: |
Visual C++ (2010) Bug |
Zitieren |
Hallihallo!
Ich bin gerade über einen Compiler-Bug bei folgendem Code gestolpert:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <type_traits>
template<class T>
void foo(T&& t)
{
typedef typename std::remove_reference<T>::type some_type;
}
void bar()
{}
int main()
{
foo(bar);
return 0;
} | |
| Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | c:\program files (x86)\microsoft visual studio 10.0\vc\include\type_traits(197): error C2752: 'std::tr1::_Remove_reference<_Ty>':
Mindestens eine teilweise Spezialisierung stimmt mit der Vorlagenargumentliste überein
1> with
1> [
1> _Ty=void (__cdecl &)(void)
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\xtr1common(356): kann 'std::tr1::_Remove_reference<_Ty&&>' sein
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\xtr1common(350): oder "std::tr1::_Remove_reference<_Ty&>"
1> xxx\bug4263.cpp(6): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::tr1::remove_reference<_Ty>".
1> with
1> [
1> _Ty=void (__cdecl &)(void)
1> ]
1> xxx\bug4263.cpp(14): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void foo<void(__cdecl &)(void)>(T)".
1> with
1> [
1> T=void (__cdecl &)(void)
1> ] | |
Leider gelingt es mir nicht, diesen Bug zu melden, da Microsoft scheinbar lieber Bug-Reports für VS2012 RC haben will. Wer von Euch VS 2012 RC hat, kann das ja mal testen und falls es immer noch nicht klappt, den Fehler melden ...
- kk |
|
|
|
 |
Zeus
Mitglied
Benutzerprofil
Anmeldungsdatum: 25.09.2003
Beiträge: 2839
|
Zeus Mitglied
19:23:15 09.08.2012 Titel: |
|
Zitieren |
VS2012 RC ist bugfrei |
|
|
|
 |
Sone
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 3142
|
Sone Mitglied
19:32:11 09.08.2012 Titel: |
|
Zitieren |
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <type_traits>
template<class T>
void foo(T&& t)
{
typedef typename std::remove_reference<T>::type some_type;
}
void bar()
{}
int main()
{
foo(bar);
return 0;
} | |
Wahnsinn. Schon wieder: Ein so einfacher Code, und so ein schwerer Bug.
Mein Gott, ich werde niemals VC++ benutzen! Jetzt weiß ich erst was PI meinte, als er sagte, VC++ ist bei Templates zum kotzen. |
_________________ You want to do X, and you think Y is the best way of doing so. Instead of asking about X, you ask about Y. | Wenn man was zum Lachen braucht: Why C++ Sucks
Zuletzt bearbeitet von Sone am 19:32:28 09.08.2012, insgesamt 1-mal bearbeitet |
|
 |
knivil
Mitglied
Benutzerprofil
Anmeldungsdatum: 11.02.2009
Beiträge: 5851
|
knivil Mitglied
19:54:36 09.08.2012 Titel: |
|
Zitieren |
Also nimmt mat ein & von T&& weg, so funktioniert es. VS 2010 unterstuetzt eben nicht wirklich C++11. |
_________________ If it were not for laughter, there would be no Tao.
Sie können einen Beitrag nicht so schnell nach Ihrem letzten absenden, bitte warten Sie einen Augenblick.
|
|
 |
krümelkacker
Mitglied
Benutzerprofil
Anmeldungsdatum: 10.08.2010
Beiträge: 2223
|
krümelkacker Mitglied
20:24:47 09.08.2012 Titel: |
|
Zitieren |
Der Haken ist glaub ich, dass der Compiler einfach intern && zu & bei Funktionsreferenzen ersetzt und dann auf einmal zwei gleich gut aussehende Spezialisierungen von remove_reference trifft.
| Zeus schrieb: | VS2012 RC ist bugfrei  |
Naja, sagen wir mal: Er kompiliert diesen Code fehlerfrei.
Aber gut zu wissen! Danke!
kk |
|
|
|
 |
dot
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 5618
|
dot Mitglied
02:24:47 10.08.2012 Titel: |
|
Zitieren |
Imo ist das kein Bug, sondern exakt das vom Standard vorgesehene Verhalten. Du gehst da vermutlich einer afaik für Perfect Forwarding eingeführten Template Argument Deduction Rule auf den Leim: Wenn einem Function Template ein lvalue übergeben wird, wo eine rvalue Reference erwartet wird, dann ist der deduzierte Typ eine lvalue Reference (§ 14.8.2.1-3).
Edit: Allerdings sollte std::remove_reference trotzdem funktionieren. Möglicherweise hat es allerdings was damit zu tun, dass sich an rvalue References nach dem Release von VC10 noch was geändert hat... |
_________________ one point of view will never reveal the entire scene.
Zuletzt bearbeitet von dot am 02:38:49 10.08.2012, insgesamt 2-mal bearbeitet |
|
 |
krümelkacker
Mitglied
Benutzerprofil
Anmeldungsdatum: 10.08.2010
Beiträge: 2223
|
krümelkacker Mitglied
09:14:56 10.08.2012 Titel: |
|
Zitieren |
| dot schrieb: |
Du gehst da vermutlich einer afaik für Perfect Forwarding eingeführten Template Argument Deduction Rule auf den Leim:
|
Nein. Die Regel ist mir bewusst. Man kann das Problem weiter auf
| C++: | #include <type_traits>
int main()
{
typedef std::remove_reference<int(&)()>::type foo;
} | |
reduzieren, wobei eigentlich der Funktionstyp int() rauskommen sollte.
| Zitat: |
Edit: Allerdings sollte std::remove_reference trotzdem funktionieren.
|
So sehe ich das auch. |
|
|
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|