В стандарте C ++ есть следующее руководство по выводу для класса шаблона std::valarray<T>
:
template<class T, size_t cnt> valarray(const T(&)[cnt], size_t) -> valarray<T>;
Однако среди конструкторов класса есть только следующий подходящий конструктор (или я ошибаюсь? )
valarray(const T&, size_t);
Однако, если запустить следующую демонстрационную программу с аналогичным руководством по выводу
#include <iostream>
#include <utility>
template <typename T>
struct A
{
A( const T &, size_t ) { std::cout << "A<T>()\n"; }
};
template<class T, size_t cnt>
A(const T(&)[cnt], size_t) -> A<T>;
int main()
{
int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
A obj( a, std::size( a ) );
}
, компилятор gcc выдает ошибку
rog.cc:17:12: error: invalid conversion from 'int*' to 'int' [-fpermissive]
17 | A obj( a, std::size( a ) );
| ^
| |
| int*
prog.cc:7:8: note: initializing argument 1 of 'A<T>::A(const T&, size_t) [with T = int; size_t = long unsigned int]'
7 | A( const T &, size_t ) { std::cout << "A<T>()\n"; }
| ^~~~~~~~~
Таким образом, возникает вопросбудь то дефект стандарта C ++, или ошибка компилятора, или я что-то пропустил.