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

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

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

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

Да, комитет C++ может даже решить отказаться от функции или в процессе стандартизации может возникнуть дефект, который заставит функцию измениться.

Как правило, не стоит полагаться на экспериментальные функции. Экспериментальные особенности - именно то, что говорит слово (то есть, чтобы экспериментировать).

Кто-то из аудитории задал вопрос во время лекции "C++ Standard Library Panel" на CppCon 2016 ( YouTube) о возможном названии experimental чтобы отпугнуть пользователей от использования чего-либо в пространстве имен:

Ребята, вы считаете [содержание std::experimental пространство имен] готово к производству, и это аргумент, который можно выдвинуть, [что] он фактически готов к производству в течение следующих 3 лет, и, возможно, вам придется изменить свой код спустя 3 года, может быть?

Майкл Вонг (председатель SG5 и SG14 и редактор Concurrency TS) первым поставил вопрос:

Я думаю, что в комитете есть твердое мнение, что он практически готов к производству. Как я уже говорил, в большинстве случаев в 99% случаев происходит попадание воздуха. Мы хотим убедиться, что это не помешает вам использовать его. Вы можете понять, почему мы хотим поместить большие функции, большие группы функций в такой контекст, чтобы он не мешал остальной части всей библиотечной системы, но также облегчал ее использование. Теперь вы можете включить GCC со специальным флагом Concepts, который, на самом деле, облегчает его сегментацию.

Элисдейр Мередит (бывший председатель LWG) продолжила:

Я собираюсь занять противоположную позицию здесь. Одна из вещей, которые Херб [Саттер] сказал как организатор WG21, стандартной группы, когда мы пошли по пути TS, заключается в том, что он не думал, что TS преуспеют, пока мы не сможем что-то выдвинуть, потому что это означает, что мы недостаточно экспериментальны, мы недостаточно амбициозны в том, для чего мы используем TS. Мы действительно хотим этого experimental чтобы намек на то, что да, эти вещи могут быть изменены, мы не привязаны к этому, и мы можем ошибиться. Это должно снизить наш барьер для вещей, которые мы считаем амбициозными и достижимыми настолько, насколько мы можем [...] Теперь, кажется, стандарт находится на трехлетнем цикле выпуска, мы должны быть намного более амбициозными в использовании действительно экспериментальных функций. в TS, и, возможно, быстрее продвигаться в основной стандарт. Но опять же, это будет забавная тема для обсуждения на следующих нескольких заседаниях [C++ Standard Committee].

Стефан Т. Лававей (сопровождающий реализацию Microsoft STL) был последним, кто ответил:

Важно проводить различие между экспериментальностью интерфейса и экспериментальностью реализации, потому что, когда вы говорите "готовность к производству", что это значит? Обычно, "производство готово", можно подумать, что речь идет о внедрении. Это вполне возможно для реализации [чего-то в std::experimental] быть абсолютно [...] пуленепробиваемым. [...] Что-то вроде [...] <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 один терпит неудачу или исчезает.
Другие вопросы по тегам