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