Bonjour,

Je vous soumets un petit bout de code qui me laisse perplexe, je copie/colle le code, et je vous explique le problème !

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
#include <sstream>
 
#ifndef __CONVERT_H
#define __CONVERT_H
 
namespace util
{
    class convert
    {
    public:
        template<typename T>
        static std::string to_string(const T & value) {
            std::ostringstream oss;
            oss << value;
            return oss.str();
        }
    private:
        convert() {}
    };
}
#endif // __CONVERT_H
L'objectif est d'obtenir une chaine (std::string) à partir de n'importe quel type. Code inspiré de la FAQ ( http://cpp.developpez.com/faq/cpp/?p...GS_convertform )

Tel quel, le code compile.

Si maintenant je teste ma méthode avec le bout de code suivant, cela compile et fonctionne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
    int index=0;
    for(...)
    {
        ...
        index++;
    }
    std::string str_index = util::convert::to_string(index);
Par contre, initialement, ma méthode util::convert::to_string était légèrement différente, c'est à dire qu'elle retournait std::string& plutôt que std::string ! L'idée étant de retourner une référence, afin de faire l'économie d'un appel à un constructeur par copie et/ou un opérateur d'assignation !

Lorsque je retourne une référence, à la fois ça compile... et ça ne compile pas

Je m'explique :
cas 1) si la ligne "std::string str_index = util::convert::to_string(index);" est mise en commentaires, ça compile !
cas 2) si la ligne n'est pas en commentaires, ça plante à la compilation !

Le message d'erreur est le suivant :

In file included from ../src/fenprincipale.cpp:1:0:
../src/convert.h: In static member function ‘static std::string& util::convert::to_string(const T&) [with T = int, std::string = std::basic_string<char>]’:
../src/fenprincipale.cpp:50:59: instantiated from here
../src/convert.h:15:28: erreur: invalid initialization of non-const reference of type ‘std::string& {aka std::basic_string<char>&}’ from an rvalue of type ‘std::basic_ostringstream<char>::__string_type {aka std::basic_string<char>}’
../src/convert.h:16:9: attention : contrôle a atteint la fin non void de la fonction [-Wreturn-type]

Cela n'a sans doute pas grande importance, mais je suis sous Linux (Ubuntu).

Avez-vous une idée ?