Почему я не могу передать std::span в шаблон функции, принимающий std::span?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему я не могу передать std::span в шаблон функции, принимающий std::span?

Сообщение Anonymous »

Я работаю с шаблонами и выводом типов в C++ и столкнулся с ошибкой вывода типа при использовании std::span, но не при использовании необработанных указателей. Ниже приведена упрощенная версия моего кода:

Код: Выделить всё

#include 
#include 

template 
void f1(std::span param)
{}

template 
void f2(const T* param)
{}

int main()
{
std::vector v{1,2,3};
std::span s{v};
// Uncommenting this line causes a compilation error:
// cannot deduce a type for 'T' that would make 'const T' equal 'int'
// f1(s);
int x = 10;
int* px = &x;
const int* z = px;
f2(px); // Works fine
f2(z);  // Works fine
}
Когда я раскомментирую вызов f1(s), я получаю ошибку компиляции, сообщающую, что компилятор не может определить тип для T, который сделал бы const T< /code> равно int. Однако аналогичные шаблонные функции для указателей, такие как f2, компилируются без проблем при передаче как int*, так и const int*.
Почему эта ошибка возникает с std::span, но не с указателями?

Подробнее здесь: https://stackoverflow.com/questions/791 ... dspanconst
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»