Стандартная библиотека MSVC не определяет оператор spaceship для std ::string, std::shared_ptr и так далее?

#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 (оператор)