Question: I'm compiling the following program using Microsoft Visual C++, as a C++20 program:

```
#include <iostream>
#include <tuple>

int main()
{
    auto t1 = std::make_tuple("one", "two", "three");
    auto t2 = std::make_tuple("one", "two", "three");

    std::cout << "(t1 == t2) is " << std::boolalpha << (t1 == t2) << "\n";
    std::cout << "(t1 != t2) is " << std::boolalpha << (t1 != t2) << "\n";

    return 0;
}

```

When I run it, I see the following output:

```
(t1 == t2) is false
(t1 != t2) is true

```

The tuples are identical, so why does it have wrong comparison results? How do I fix this?

Answer: 
You are comparing pointers to buffers of characters, not strings.

Sometimes the compiler will turn two different `"one"`s into the same buffer, sometimes it will not.

In your case, it isn't. Probably a debug build.

Add `#include <string_view>`, then

```
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);

```

and you'll get what you expect. (In pre-[c++17](/questions/tagged/c%2b%2b17 "show questions tagged 'c++17'") compilers, use `<string>` and `""s` instead of `<string_view>` and `""sv`).
`auto` is not always your friend. I would argue the proper way to get reliably the “right” behaviour without boilerplate is to explicitly use a type that you know has value-equality. Then you can also omit the `make_tuple` and simply use the initialiser-list constructor:

```
#include <string>
#include <tuple>
#include <iostream>

typedef std::tuple<std::string, std::string, std::string> StrTriple;

int main() {

  StrTriple t1{"one", "two", "three"};
  StrTriple t2{"one", "two", "three"};

  std::cout << "(t1 == t2) is " << std::boolalpha << (t1 == t2) << "\n";
  std::cout << "(t1 != t2) is " << std::boolalpha << (t1 != t2) << "\n";

    return 0;
}

```

No doubt some would argue that the memory management of `std::string` incurs unnecessary overhead. `string_view` *may* be preferrable, however chances are in a real-world application the strings will need to be dynamically allocated anyway somewhere.