#c #visual-c #c 20 #spaceship-operator
#c #visual-c #c 20 #spaceship-operator
Вопрос:
Я пытаюсь сделать свою программу мультиплатформенной, изначально написанной для Linux. Сообщается, что MSVC (я использую 19.28) поддерживает оператора космического корабля с версии 19.20 (https://en.cppreference.com/w/cpp/compiler_support/20 ), но похоже, что он не определяет этот оператор для std::string или std::shared_ptr (вероятно, для многих других существ).
Что я именно пытаюсь сделать, так это:
// int x(1), y(2); // ok!
// std::string x("1"), y("2"); // nope
std::shared_ptr<int> x(new int), y(new int); // nope
auto r = x <=> y; // error C2676 for string and shared_ptr
Живой пример:
https://godbolt.org/z/Eo49hh
Он работает в GCC 10.2. Я упускаю какой-то момент здесь, или он не поддерживается полностью?
Комментарии:
1. Вы установили стандарт языка C
std:c latest
на странице свойств проекта?2. @D-RAJ Да, также в живом примере на godbolt вы можете видеть, что он установлен. Я только что просмотрел стандартные заголовки для msvc и, по-видимому, он просто не определен (в отличие от заголовков gcc). Может быть, кто-нибудь знает какой-нибудь обходной путь?
Ответ №1:
MSVC поддерживает operator<=>
, но это не значит, что они реализованы для всех библиотек. Из вашей ссылки на cppreference в разделе «Возможности библиотеки C 20» фактически показано, что MSVC не имеет P1614R2 (добавление <=> в стандартную библиотеку)
Он имеет частичную поддержку P0768R1 (библиотечная поддержка operator<=> <compare>
) и полную поддержку P1185R2 (оператор)