Ceci est en effet un bogue dans le compilateur, je l'ai ouvert un defect et a obtenu la réponse suivante.
Bonjour Motti,
Nous vous remercions de soumettre cette question. Comme indiqué dans la publication de stackoverflow, il s'agit d'un bug dans notre implémentation decltype. Malheureusement, nous ne pouvons pas corriger ce bug dans la prochaine version de Visual Studio car le code est relativement rare, et nous sommes particulièrement limités en ressources.
question originale suit
Je joue un peu avec les C++ 0x caractéristiques VS10 et je suis tombé sur le problème suivant.
std::map<int, int> map()
{
return std::map<int, int>();
}
template <class F>
auto call(F f) -> decltype(f())
{
auto ret = f();
return ret;
}
void check()
{
auto m = call(map);
}
Je reçois l'avertissement suivant:
avertissement C4172: adresse de retour de la variable locale ou temporaire
Cependant quand je change le prototype de call
être le style ancien:
std::map<int, int> call(F f)
C'est bon, c'est aussi OK quand call
n'est pas une fonction de modèle (même en utilisant des types de retour déduits). Si je regarde le type de ret
c'est std::map<int, int>
(pas de références ou de pointeurs).
Est-ce un bug dans VS10 ou est-ce que je manque quelque chose?
Est-ce que le débogueur vous dira quel type '' auto ret' résout? Je sais qu'il y a des différences entre la façon dont 'auto' et' decltype' se comportent, mais je n'ai aucune idée si cela cause le problème ... – Cogwheel
FWIW, Comeau aboie à 'auto' précédant' call() '. (Bien sûr, je n'ai aucune idée de qui est juste ici ...) – sbi
@sbi avec C++ 0x allumé? – Motti