LINUX.ORG.RU

Дедукция типов в крестовых темплейтах

 ,


1

5

Взято частично из https://msdn.microsoft.com/en-us/library/td1esda9.aspx по мотивам http://www.viva64.com/ru/b/0391/ (http://www.viva64.com/ru/b/0391/)

#include <iostream>

template <int size>
void strcpy_s(char (&strDestination)[size]) {
	(void)strDestination;
	std::cout << size << std::endl;
}

int main() {
	char buf[10];
	strcpy_s(buf);
	return 0;
}

Код исправно печатает 10, но я не понимаю, почему для определения типа параметра в strcpy_s() используется нотация (&attrname).

Cast Andrey_Karpov_2009.

★★★★★

Чтобы не происходило копирования всего массива в стек, а передавалась только ссылка?

Kroz ★★★★★
()

Ссылка на массив, вестимо. Когда в списке аргументов функции указывается «просто массив», он неявно заменяется на указатель.

intelfx ★★★★★
()
Ответ на: комментарий от Kroz

Массивы никогда не копируются при передаче. Дело не в этом, а в type inference.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

т.е. char strDestination[size] свернется в обычный char* и компилятор не будет детектить размерность, а char (&strDestination)[size] не свернется в char*& и дедукция будет работать?

x0r ★★★★★
() автор топика

Не совсем понятно, что ты не понимаешь. Если опустить скобки, & будет относится к char, а не к самому массиву.

Или ты вообще про передачу массива по ссылке? Ну так иначе никак не получится узнать его размер, потому что просто массив (без ссылки) трансформируется в указатель. Это называется array to pointer decay rule.

quoob
()
Ответ на: комментарий от intelfx

странно. тогда не понятно, почему такая перегрузка работает:

void strcpy_s(char strDestination[10]);
void strcpy_s(char strDestination[20]);
x0r ★★★★★
() автор топика
Ответ на: комментарий от Dudraug

мне было не понятно, почему для дедукции типов в шаблонных функциях при передаче параметром char[N] нужно, чтобы параметр был ссылкой на массив. т.е. было не понятно, почему не #1, а #2:

#1 template <int size> void strcpy_s(char strDestination[size]);
#2 template <int size> void strcpy_s(char (&strDestination)[size])

intelfx правильно подсказал на счет свертывания типов:

14.8.2.1 Deducing template arguments from a function call [temp.deduct.call]

Template argument deduction is done by comparing each function template parameter type (call it P) with the type of the corresponding argument of the call (call it A) as described below.

If P is not a reference type:

-- If A is an array type, the pointer type produced by the array-to-pointer standard conversion (4.2) is used in place of A for type deduction; otherwise,

ссылка тут, судя по спеке, специальный костылик.

x0r ★★★★★
() автор топика
Последнее исправление: x0r (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.