2016-06-17 2 views
2

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.

+3

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

+1

Cela peut être un bug. Problèmes MSVS 2015 * avertissement C4172: adresse de retour de la variable locale ou temporaire * – NathanOliver

+0

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

Répondre

1

On dirait qu'il est un bogue dans Visual Studio, vous pouvez le trouver a été signalé pour VS 2012 et il semble qu'il était encore présent en 2013:

https://connect.microsoft.com/VisualStudio/feedback/details/776530/warning-c4172-not-emitted

lien ci-dessus peut être un double de un autre, l'exemple de ce rapport de bogue semble tout à fait le même que votre exemple de code:

// main.cpp 

struct A 
{ 
}; 


struct B 
{  
    A a() const {return A();} 
}; 

struct C 
{ 
    A const& a() const 
    { 
     return B().a(); 
    } 
}; 

int main() 
{ 
    return 0; 
} 
+0

Bon vieux Microsoft * Statut: Fermé comme ne Fixera pas Fixe * – NathanOliver

+0

Ce n'est pas un bug mais considéré par MS comme une fonctionnalité, de toute façon il a été ajouté intentionnellement – Slava

+1

Bien depuis vs2015 ce feautre a été enlevé, vous pouvez trouver ici rapport similaire avec explication détaillée pourquoi c'est mauvais: https://connect.microsoft.com/VisualStudio/feedback/details/1425276/false-positive-error-c4172-returning-address-of-local-variable-or-temporary – marcinj