Код: Выделить всё
enum A { A1, A2 };
enum B { B1, B2 };
TEST(...)
{
ASSERT_EQ(A1, B1); // compiles fine in C++23 and C++26
ASSERT_THAT(A1, Eq(B1)); // does not compile in C++26
}
700 | return Op()(lhs, Unwrap(rhs_));
..compilers_c++_x86_gcc_15.2.0/include/c++/15.2.0/bits/stl_function.h:496:9: примечание: не удалось вывести/заменить аргумент шаблона:
Этот упрощенный код Google преобразуется для использования A1 == B1 и std::equal_to{}(A1, B1):
Код: Выделить всё
enum A { A1, A2 };
enum B { B1, B2 };
void foo()
{
// ASSERT_EQ(A1, B1);
if (A1 == B1) { ... } // compiles fine in C++23 and C++26
// ASSERT_THAT(A1, Eq(B1));
if (std::equal_to{}(A1, B1)) { ... } // does not compile in C++26
}
Это происходит только в gcc(g++) — clang компилирует обе версии.
Конечно, это ошибка в тесте для сравнения значений из разных перечислений, и прекрасно, что std::equal_to{} это улавливает.
Это поведение предписано C++26 или просто какая-то «ошибка» в стандартной библиотеке gcc? Это работает только в gcc(g++). Clang прекрасно компилируется в обоих направлениях в C++23 и C++26.
Будет ли A1 == B1 вызывать ошибки компиляции в финальной версии C++26 или это не изменится?
Подробнее здесь: https://stackoverflow.com/questions/798 ... les-in-c26
Мобильная версия