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?
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
).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With