Quel est le type de "one"
? Il ne s'agit pas d'une chaîne de caractères, mais d'un littéral de chaîne de caractères.
Votre problème se résume essentiellement à ce code :
char const* a = "one";
char const* b = "one";
std::cout << "(a == b) is " << std::boolalpha << (a == b) << "\n";
std::cout << "(a != b) is " << std::boolalpha << (a != b) << "\n";
Ce qui donnera très probablement le même résultat.
C'est parce qu'une chaîne littérale se décomposera en un fichier char const*
. La comparaison de deux pointeurs permet de comparer leur emplacement dans la mémoire. Maintenant, il s'agit de savoir si votre compilateur replie les littéraux de chaîne en un seul. Si les chaînes de caractères sont repliées, alors elles seront égales, sinon, elles ne seront pas égales. Cela peut varier en fonction des différents niveaux d'optimisation.
Comment pouvez-vous alors corriger votre comparaison ?
Utilisez de préférence std::string_view
puisque vous ne semblez pas avoir besoin de posséder ou de modifier leur contenu :
using namespace std::literals;
// ...
auto t1 = std::make_tuple("one"sv, "two"sv, "three"sv);
auto t2 = std::make_tuple("one"sv, "two"sv, "three"sv);
El std::string_view
est une enveloppe mince autour d'un pointeur et d'une taille, et définit un opérateur de comparaison qui vérifie l'égalité des valeurs.