Идентификатор частичной концепции C ++: В чем причина явного порядка спецификации шаблона / особого статуса первого аргумента? - PullRequest
1 голос
/ 29 января 2020

Я начал экспериментировать с функцией концепций C ++ 20 и был очень рад, когда понял, что можно частично явно указать аргументы шаблона для концепций. Я прочитал статью cppreference и не нашел упомянутое там.

Но потом я понял кое-что странное: порядок спецификации аргументов шаблона полностью изменился, как я и ожидал. Предоставляя один явный аргумент шаблона, он заменяет второй шаблон в списке шаблонов:

#include <concepts>
#include <type_traits>

/// Concept in order to deduce if sth. is base of sth else
template <typename Impl, typename Base>             //XXX: here the order of Impl and Base are not 
concept Implements = std::is_base_of_v<std::remove_reference_t<Base>, // what I would've expected.
                                       std::remove_reference_t<Impl>>;
/// Example Base class impl
struct BaseExample {};
/// Implementation of BaseExample
struct ImplExample : BaseExample {};

/// Function in which the concept is applied
template <Implements<BaseExample>... Baes> void f(Baes &&... ) {}//} ((void)b, ...); }

int main() {
  (void) std::is_base_of_v<BaseExample, std::remove_reference_t<ImplExample &&>>; //< true
  (void) std::is_base_of_v<BaseExample, std::remove_reference_t<ImplExample&>>;  //< true
  f(ImplExample{}, ImplExample{});
}

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

  1. Будут ли разрешены частичные явные спецификации шаблонов (вероятно) после выпуска стандарта?
  2. Этот порядок спецификаций, скорее всего, останется прежним или это ошибка?
  3. Как бы я ответил на этот вопрос для себя? Из того, что я понимаю, стандарт c ++ 20 еще не готов, и я нашел список Стандартных документов C ++ , из которых я кратко искал заголовки тех, которые были предложены в 2020 году для «концепции». Проверяет ли эти документы путь к go, или есть единый доступный документ, который объединяет пункты, о которых в настоящее время договорились авторы?

Код можно найти здесь .

edit После публикации я проверил поведение, когда указаны три аргумента шаблона. Похоже, я неправильно истолковал порядок спецификации: первый аргумент «остается свободным», чтобы содержать аргумент, который нужно проверить, а явные спецификации начинаются со второго аргумента. Это можно увидеть здесь . Несмотря на то, что я выяснил причину порядка спецификации, я был бы очень заинтересован в ответах на вопросы выше.

1 Ответ

3 голосов
/ 30 января 2020

Да, part-concept-id s, безусловно, вещь C ++ 20. Специальный статус первого аргумента, хотя и удивительно, допускает такие случаи, как std::constructible_from, который объявлен как

template<class T,class ...Args>
concept constructible_from=…;

std::constructible_from<int,int> и является ограничением типа что требует , чтобы все, что он вводит, было конструируемым из двух int аргументов. Однако это также может быть выражение , и в этом случае оно сообщает , может ли int быть построено из int (спойлеры: true), но этот потенциал путаница существует независимо от порядка аргументов.

Если бы T должен был go в конце, не было бы никакого способа использовать такую ​​концепцию: только вычет аргумента шаблона или аргументы шаблона по умолчанию могут предоставлять значения для параметр шаблона, выходящий за пределы параметра pack , и здесь ни один из них не применим.

Каждая рассылка, опубликованная на сайте, на который вы ссылаетесь, содержит последний черновик стандарта, а альтернативные рассылки включают аннотации в виде на какие документы были приняты. Или вы можете просто посетить хранилище черновиков (по крайней мере, если вы счастливы, читая LaTeX).

...