Представлены экспериментальные функции современного C++ надежной для долгосрочных проектов?

У меня есть проект, который в настоящее время использует C++11/14, но он требует что-то типа СТД::файловая система, которая доступна только в C++17, и, следовательно, я не'т иметь возможность на данный момент использовать его. Однако я вижу, что это's доступный на мой текущий компилятор как СТД::экспериментальный::файловая система. Это хорошая идея, чтобы использовать экспериментальные функции, предполагая, что я мог бы в будущем добавить что-то вроде:

#ifdef CXX17 //if this is C++17
std::filesystem::something ...;
#else
std::experimental::filesystem::something ...;
#endif

Мои опасения:

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

2. Экспериментальные особенности подвержены большим изменениям, что делает их ненадежными?

Может быть, там's больше вещей, чтобы удивляться. Почему я должен или не должен их использовать? Я'м озадачиться новый проект и Дон'т знаю, что делать.

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

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

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

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

Как правило, это's не хорошая идея, чтобы зависеть от экспериментальных функций. Экспериментальные функции в точности то, что говорит слово (например, для эксперимента).

Комментарии (10)

Кто-то из зала задал вопрос в "в стандартной библиотеки C++ - панель" и говорить на CppCon 2016 ([Ютуб][1]) о возможных название "экспериментальный", чтобы напугать пользователей от использования какого-либо пространства имен:

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

Майкл Вонг (председатель ИК5 и SG14 и редактор параллелизма ТС) выпустил первый вопрос:

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

Алисдэр Мередит (бывший председатель РГПВ), затем последовали:

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

Т. Lavavej Стефан (сопровождающий от Microsoft'реализация стл s) был последним, чтобы ответить:

Это's важный для того чтобы провести различие между experimentalness интерфейса и experimentalness реализации, потому что, когда вы говорите "не готов" и что это значит? Как правило, и"готов" и, можно подумать, что речь о реализации. Это'вполне возможно для осуществления [что-то в СТД::экспериментальный] абсолютно [...] пуленепробиваемый. [...] Что-то вроде [...] В в<случайных>` заголовок в ТР1, [это было] очень, очень приятно в ТР1, и вы могли бы иметь абсолютно пуленепробиваемые осуществления этого, но оказалось, что интерфейс существенно месили [до релиза] C++11 и [...] если бы мы знали тогда то, что мы делаем сейчас, поместив в "экспериментальные" было бы лучшим сигналом для людей, что, "Эй, может быть, вы Дон'т хотите использовать СТД::экспериментальный::variate_generator, потому что, ха-ха, Это'ы исчезнешь в C++11 и".

Так и кажется, что есть какое-то желание из стандартной библиотеки разработчики и члены комитета, которые, в будущем, по крайней мере, содержимое СТД::экспериментальный пространства имен должен быть по-настоящему "подопытные" в природе, и это не должно быть само собой разумеющимся, что что-то в СТД::экспериментальный` войдет в стандарт C++.

И нет, насколько я понимаю, это до стандарта, поставщиков библиотеке, можно ли их реализовать различные функции в СТД::экспериментальном.

Комментарии (2)

quot;подопытные&quot&; - это слегка преувеличено срок. Библиотека файловой системы `возникла в Boost и прошли через несколько итераций, прежде чем будет представлен в ISO.

Однако стандарты ИСО намеренно чрезвычайно консервативной. Называть это экспериментальным путем ИСО явно не'т обещаю, что имен будет стабильным; его'ы совершенно ясно, что вам нужно решить свой код через некоторое время в будущем. Но, зная ИСО, это'ы вероятно, что там будет руководство.

Что касается совместимости между компиляторами, ожидал, что это будет разумно. Но будут случаи углу (думаю диска Windows относительные пути например), и что'именно поэтому будущий стандарт может нарушить существующий код. В идеале, это разобьет вам код, если, и только если зависит от этого угла дело, но это's не гарантия.

Комментарии (0)

может быть, там's больше вещей, чтобы удивляться.

Несколько пунктов, чтобы рассмотреть:

  • Как мультиплатформенный проект? Если существует только один компилятор, то вы можете проверить его реализации и послужной решать. Или спросите у них!

  • Насколько велик ваш код? Насколько велико будет влияние изменения?

  • Как основополагающее значение для вашего проекта являются возможности, предоставляемые API/библиотеки/функции?

  • Каковы альтернативы?

  • Использовать экспериментальную функцию, адаптировать код для модификации, когда/если она становится стандартизированной. Может быть так же легко, как удаление экспериментальные::, или так сложно, как заставляя обходные пути.

  • Добавить слой абстракции (Серега Балеста комментарий). Если экспериментальная функция изменения вашего переписывает изолированы. Для стандартной функции, это может быть перебор (СТД::файловая система-это уже уровень абстракции...).

  • Использовать другой API/библиотека. Те же вопросы: зрелость? робастность? стабильность? портативность? простота использования? особенности?

  • В случае с std::файловая система (или сеть ТС), есть тип Boost::файловая система (респ. буст::асио) как альтернативный или запасной вариант, в случае "экспериментальные" не удается или desappears.

Комментарии (0)