Являются ли экспериментальные возможности современного 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 77

4 ответа:

  1. это гарантирует, что все совместимые компиляторы имеют одинаковые экспериментальные функции?

нет, экспериментальные функции не являются обязательными.

  1. подвержены ли экспериментальные функции большим изменениям, которые делают их ненадежными?

да, комитет 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.