déduction de type qui cause un segfault
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:
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:
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:
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éé.
Citation:
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.