Являются ли экспериментальные возможности современного C++ надежными для долгосрочных проектов?
у меня есть проект, который в настоящее время использует C++11/14, но он требует что-то вроде std::filesystem
, который доступен только в C++17, и поэтому у меня нет возможности использовать его в настоящее время. Я вижу, однако, что он доступен в моем текущем компиляторе как std::experimental::filesystem
. Это хорошая идея, чтобы использовать экспериментальные функции, предполагая, что я мог бы в будущем добавить что-то вроде:
#ifdef CXX17 //if this is C++17
std::filesystem::something ...;
#else
std::experimental::filesystem::something ...;
#endif
мои соображения:
1. Это гарантирует, что все совместимые компиляторы имеют одинаковые экспериментальные особенности?
2. Подвержены ли экспериментальные функции большим изменениям, которые делают их ненадежными?
может быть, есть еще о чем задуматься. Почему я должен или не должен их использовать? Я озадачен новым проектом и не знаю, что решить.
4 ответа:
- это гарантирует, что все совместимые компиляторы имеют одинаковые экспериментальные функции?
нет, экспериментальные функции не являются обязательными.
- подвержены ли экспериментальные функции большим изменениям, которые делают их ненадежными?
да, комитет C++ может даже решить отказаться от функции или в процессе стандартизации может возникнуть дефект, который заставит функцию изменение.
как правило, это не очень хорошая идея, чтобы зависеть от экспериментальных особенностей. Экспериментальные особенности-это именно то, что говорит слово (т. е. экспериментировать).
кто-то из аудитории задал вопрос во время выступления "C++ Standard Library Panel" на CppCon 2016 (YouTube) о потенциале имя
experimental
чтобы отпугнуть пользователей от использования чего-либо в пространстве имен:вы, ребята, рассмотрим содержание
std::experimental
пространство имен] производство готово и это аргумент, который может быть сделан, [что] это эффективно производство готово в течение следующих 3 лет, и, возможно, вам придется изменить свой код 3 года спустя, может быть?Майкл Вонг (председатель SG5 и SG14 и редактор параллелизма TS) первым задал вопрос:
Я думаю, что есть сильный консенсус в комитете, что он практически готов к производству. Как я уже говорил, в большинстве случаев 99% из них попадает в воздух. Мы хотим убедиться, что это не является препятствием для вас, чтобы использовать его. Вы можете понять, почему мы хотим поместить большие функции, большие группы функций, в такой контекст, чтобы он не нарушал остальную часть всей библиотечной системы, но также упрощает ее использование. Теперь вы можете включить GCC с определенным флагом для концепций, вы знаете, что на самом деле упрощает его сегментацию.
Алисдэр Мередит (бывший председатель РГПВ) затем продолжил:
Я собираюсь занять противоположную позицию здесь. Одна из вещей, которую Херб [Саттер] сказал в качестве организатора WG21, стандартной группы, когда мы отправились по пути TSE is, он не думал, что TSE преуспеет, пока мы не сможем что-то сделать, потому что это означает, что мы недостаточно экспериментальны, мы недостаточно амбициозны в том, для чего мы используем TSE. Мы действительно этого хотим
experimental
чтобы намекнуть, что да, эти вещи могут измениться, мы не привязываемся к этому, и мы можем ошибаться. Это должно снизить наш барьер для вещей, которые мы считаем настолько амбициозными и достижимыми, насколько это возможно [...] Теперь стандарт, похоже, находится на трехлетнем цикле выпуска, мы должны быть гораздо более амбициозными в том, чтобы поместить действительно экспериментальные функции в TS и, возможно, быстрее продвигать вещи в основной стандарт. Но опять же, это будет забавная тема для нас, чтобы обсудить на следующих нескольких заседаниях [c++ standard committee].Стефан т. Лававей (сопровождающий реализации STL Microsoft) был последним, чтобы ответить:
это важно проведите различие между экспериментальностью интерфейса и экспериментальностью реализации, потому что когда вы говорите "производство готово", что это значит? Обычно, "производство готово", вы бы подумали, что говорить о реализации. Вполне возможно, для реализации чего-то в
std::experimental
] абсолютно [...] пуленепробиваемый. [...] Что-то вроде [...] the<random>
заголовок в TR1, [это было] очень, очень приятно в TR1, и вы могли бы иметь абсолютно пуленепробиваемая реализация этого, но оказалось, что интерфейс существенно вспенился [до выпуска] C++11 и [...] если бы мы знали тогда, что мы делаем сейчас, поставив вexperimental
было бы лучшим сигналом для людей, что, "Эй, может быть, вы не хотите использоватьstd::experimental::variate_generator
потому что, ха-ха, он исчезнет в C++11".таким образом, кажется, что есть некоторое желание среди разработчиков стандартных библиотек и членов комитета, что, по крайней мере, в будущем содержание
std::experimental
пространство имен должно быть действительно "экспериментальным" по своей природе, и не следует считать само собой разумеющимся, что что-то вstd::experimental
войдет в стандарт C++.и нет, насколько я понимаю, это зависит от стандартных поставщиков библиотек относительно того, предоставляют ли они реализации для различных функций внутри
std::experimental
.
"экспериментальный" - это несколько преувеличенный термин. Элемент
filesystem
библиотека возникла в Boost и прошла там несколько итераций, прежде чем была отправлена в ISO.однако стандарты ISO намеренно очень консервативное. Вызов его экспериментальным означает, что ISO явно не обещает, что именование будет стабильным; совершенно ясно, что вам нужно будет повторно обратиться к вашему коду некоторое время в будущем. Но зная ISO, вполне вероятно, что будет руководство как.
что касается совместимости между компиляторами, ожидал, что это будет разумно. Но будут угловые случаи (например, относительные пути к диску Windows), и именно поэтому будущий стандарт может сломать ваш существующий код. В идеале, это сломает ваш код, если и только если вы зависите от этого углового случая, но это не гарантия.
может быть, есть еще о чем задуматься.
несколько моментов, чтобы рассмотреть:
как мультиплатформенный проект? Если есть только один компилятор участвует, то вы можете проверить его реализацию и послужной список, чтобы решить. Или спросите их!
насколько велика ваша кодовая база? Насколько велико будет влияние изменений?
насколько фундаментальны для вашего проекта функции предоставляется API / библиотека / функция?
каковы альтернативы?
- используйте экспериментальную функцию, а затем адаптируйте код к изменениям, когда/если он станет стандартизированным. Может быть так же просто, как удаление
experimental::
, или так же трудно, как заставить обходные пути.- добавить слой абстракции (Серега Балеста комментарий). Если экспериментальная функция изменяет ваши перезаписи изолированы. Для стандартной функции это может быть излишним (std::filesystem уже есть уровень абстракции...).
- используйте другой API / библиотеку. Те же вопросы: зрелость? надежность? стабильность? мобильность? простота использования? особенности?
- в случае std:: filesystem (или сетевых TS), есть boost::filesystem (ОТВ. boost:: asio) в качестве альтернативы или запасного варианта, в случае
experimental
один сбой или desappears.