Объявление типа параметра функции как авто - PullRequest
0 голосов
/ 22 сентября 2018

Я использую GCC 6.3 и, к моему удивлению, следующий фрагмент кода скомпилирован.

auto foo(auto x)
{
    return 2.0*x;
}
....
foo(5);

AFAIK это расширение GCC.Сравните со следующим:

    template <typename T, typename R>
    R foo(T x)
    {
        return 2.0*x;
    }

Кроме того, что вычет типа возвращаемого значения эквивалентен приведенному выше объявлению?

1 Ответ

0 голосов
/ 22 сентября 2018

При использовании того же GCC (6.3) с флагом -Wpedantic будет выдано следующее предупреждение:

warning: ISO C++ forbids use of 'auto' in parameter declaration [-Wpedantic]
  auto foo(auto x)
          ^~~~

При компиляции в более новых версиях GCC даже без -Wpedantic сгенерирует это предупреждение, напоминая вам о флаге -fconcepts:

warning: use of 'auto' in parameter declaration only available with -fconcepts
  auto foo(auto x)
          ^~~~
Compiler returned: 0

И действительно, концепции делают это:

void foo(auto x)
{
    auto y = 2.0*x;
}

эквивалентно этому:

template<class T>
void foo(T x)
{
    auto y = 2.0*x;
}

См. Здесь : "Если какой-либо из параметров функции использует заполнитель (либо auto, либо ограниченный тип)), вместо этого объявление функции является сокращенным объявлением шаблона функции : [...] (понятия TS) "- выделено мной.

...