Я пытаюсь использовать концепции C ++ 20, чтобы начать с ними знакомство. Я чувствую себя довольно комфортно с простыми концепциями, например со стандартной концепцией movable
. Я могу написать что-то вроде этого (во всех примерах я предполагаю, что я using namespace std
, и я включил <concepts>
и любой другой необходимый заголовок):
template<movable T>
int foo (T obj);
И убедитесь, что при вызове этой функции переданный объект obj
можно переместить. Я могу написать это даже в более длинной форме:
template<typename T>
requires movable<T>
int foo (T obj);
И результат будет таким же (я думаю).
Но теперь давайте посмотрим на другую концепцию, такую как same_as
. same_as
принимает параметр 2 шаблонов (2 типа для сравнения), поэтому я могу написать:
template<typename T>
requires same_as<T, string>
int bar (T obj);
И теперь T равно string
. Но как я могу написать это в более короткой форме? Я пытался, и я могу написать это (как я и ожидал):
template<same_as<string> T>
int bar (T obj);
Но каково формальное правило этой формы?
Является ли name (T
) параметра шаблона функции, введенного в качестве первого аргумента шаблона концепции? Или, может быть, как в прошлом? Я не знаю, очень мало информации об этом топи c. Я имею в виду, что в этом примере это не имеет значения, потому что same_as<A, B>
семантически эквивалентно same_as<B, A>
, но в некоторых случаях порядок имеет значение.
Я знаю, что есть вопросы с похожими названиями, такими как , этот , но он задает другое.
Это ресурсы, из которых я пытался получить информацию , но не удалось: cppReference , cppModernes , open-std (я просматривал годы 2018, 2019 и 2020) и этот пост .