Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why are my two tuples containing strings, created the same way, not equal?

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?

like image 426
AeroSun Avatar asked Sep 03 '20 13:09

AeroSun


1 Answers

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 compilers, use <string> and ""s instead of <string_view> and ""sv).

like image 66
Yakk - Adam Nevraumont Avatar answered Sep 24 '22 10:09

Yakk - Adam Nevraumont