Std::equal_to{}(A1, B1) не компилируется, а A1 == B1 компилируется в C++26 для перечислений без области видимости?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Std::equal_to{}(A1, B1) не компилируется, а A1 == B1 компилируется в C++26 для перечислений без области видимости?

Сообщение Anonymous »

Я заметил несоответствие между кодом C++23 и C++26 при использовании googlemock:

Код: Выделить всё

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
}
/opt/compiler-explorer/libs/googletest/trunk/googletest/include/gtest/gtest-matchers.h:700:16: ошибка: нет соответствия для вызова '(std::equal_to) (const A&, const B&)'
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
}
См. godbolt.
Это происходит только в 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»