Можно ли полностью удалить шаблон ключевого слова в C ++ 20 для понятий? - PullRequest
1 голос
/ 08 октября 2019

Например, используя Visual Studio 16.3 с флагом

/ std: c ++ последний

, как здесь указано здесь Я могу написать.

#include <concepts>

template <std::integral T>
T plus1(T a) {
    return a + 1;
}


int main() {

    auto i = plus1(10);

}

Однако я не могу написать

#include <concepts>

std::integral plus1(std::integral a) {
    return a + 1;
}


int main() {

    auto i = plus1(10);

}

Но я читаю здесь , что это должно быть возможно.

Ответы [ 2 ]

4 голосов
/ 08 октября 2019

Concepts TS предлагает так называемый «краткий синтаксис», который позволяет вам неявно объявлять функцию шаблоном, используя концепцию вместо typename в списке параметров. Комитет ISO C ++ посчитал это спорным, когда попытался включить Концепции TS в стандарт. Они хотели узнать, просматривая объявление функции, был ли это шаблон или нет.

Через некоторое время они придумали альтернативный краткий синтаксис : вы используете auto вычет (взятый из общих лямбда-выражений), ограниченный именем концепции:

std::integral auto plus1(std::integral auto a) {
    return a + 1;
}

Однако большинство реализаций концепций в настоящее время реализуют функциональные возможности Концепции TS, а более новые вещи еще не реализованы. У VS никогда не было реализации Concepts TS, и они прямо говорят, что еще не реализовали краткий шаблонный синтаксис такого рода.

0 голосов
/ 08 октября 2019

Нет. Только в основных случаях. В некоторых ситуациях вам может понадобиться, например, точный тип. Например, чтобы сделать переадресацию, вы пишете

template <class ... TT>
void SomeFunc(TT && ... tt)
 {
  AnotherFunc( std::forward<TT>(tt)... );
 }
...