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>.
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));
}
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
int main(int, char **) {
	std::string str = "Hello";
	auto t = createText(str);
	std::cout << t.append(" World").get() << std::endl;
}
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
int main(int, char **) {
	std::string str = "Hello";
	std::cout << createText(str).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éé.
createText()
Text()
append()
~Text()
append()
get()
Erreur de segmentation (core dumped)
Et je n'arrive pas à expliquer pourquoi, est-ce que c'est du à l'utilisation de la sémantique de mouvement ?
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.