Tenir compte de ce code simple:Pourquoi l'avertissement du compilateur "renvoyer la référence à l'objet temporaire" n'est-il pas déclenché?
struct Container {
struct Item {};
Item operator[](size_t /*index*/) const {
return Item();
}
const Item& f() const {
return operator[](0);
}
};
int main()
{
Container c;
const Container::Item& item = *c.begin();
return 0;
}
Il a un bug, et je suis surpris que cela ne m'a pris environ 30 minutes pour avis: iterator::operator*()
renvoie une référence à l'objet temporaire. Habituellement, il lance un avertissement. Pourquoi pas dans ce cas?
MSVC 2013 (ensemble d'outils v120), compilé avec /W4
. Il s'agit du C4172, un avertissement de niveau 1.
FWIW, l'attendu « avertissement C4172: adresse de retour de la variable locale ou temporaire » est ce que je veux avec http://webcompiler.cloudapp.net/. – hvd
Cela peut être un bug. Problèmes MSVS 2015 * avertissement C4172: adresse de retour de la variable locale ou temporaire * – NathanOliver
ah, est-ce parce que vous ne renvoyez pas un objet temporaire? vous stockez une référence au conteneur, donc si ce conteneur est détruit, vous obtiendrez un segfault? Je ne vois pas comment cet objet est temporaire dans la portée de l'opérateur si son conteneur de paramètre est défini edit: ah juste parce que l'opérateur de conteneur renvoie le temporaire ... désolé pour tout mon bruit – kirinthos