Bonjour.
Je suis en train d'écrire une petite lib C++ qui manipule indifféremment des std::string, des std::wstring et plus généralement n’importe quel std::basic_string<CharT>.
J'ai la fonction createText() pour déduire automatiquement le type de string et éviter à l'utilisateur d'avoir à l'écrire.
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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 #include <string> #include <sstream> #include <iostream> #include <utility> template<class CharT> class Text { public: typedef std::basic_string<CharT> String; Text(const String& str) { std::cout << "Text()\n"; append(str); } ~Text() { std::cout << "~Text()\n"; } Text(const Text&) = delete; Text(Text && other) { std::cout << "Text(&&)\n"; std::move(other.oss); } Text& append(const String& str) { std::cout << "append()\n"; oss << str; return (*this); } String get() const { std::cout << "get()\n"; return oss.str(); } private: std::basic_ostringstream<CharT> oss; }; template<class CharT> Text<CharT>&& createText(const std::basic_string<CharT>& str) { std::cout << "createText()\n"; return std::move(Text<CharT>(str)); }
Avec ce main, il n'y a pas de problèmes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 int main(int, char **) { std::string str = "Hello"; auto t = createText(str); std::cout << t.append(" World").get() << std::endl; }
Alors que celui-ci provoque un segfault, il semblerai que l'objet Text retourné par createText() soit détruit juste après qu'il ait été créé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 int main(int, char **) { std::string str = "Hello"; std::cout << createText(str).append(" World").get() << std::endl; }
Et je n'arrive pas à expliquer pourquoi, est-ce que c'est du à l'utilisation de la sémantique de mouvement ?createText()
Text()
append()
~Text()
append()
get()
Erreur de segmentation (core dumped)
Est-ce qu'il y a moyen de rendre la deuxième syntaxe utilisable ?
Par ailleurs, est-ce qu'il est possible que le code s'adapte entre cout et wcout automatiquement ?
Cordialement.
Partager