c++の関数テンプレートと参照

関数テンプレートでは、型がバインドされるようなので、
こんな書き方ができるみたいです。

template <size_t N>
unsigned int foo(const char (&str)[N])
{
	return N;
}

int main(void) {
	std::cout << foo("foo") << std::endl;
	return 0;
}

これはstrを参照で渡しているからできることですね。
# 型がconst char [4]になります
Cじゃ配列数は渡せないんじゃないかなあ・・・


これの元になったコードを見たときに、
Nがどこから来ているのか分からなかったので、びっくりしました。


というわけで、脈絡もなく階乗のコード置いておきますね。

template <size_t N>
unsigned int foo(const char (&str)[N]) {
	return N * foo(reinterpret_cast<const char (&)[N-1]>(str));
}

template <>
unsigned int foo(const char (&str)[1]) {
	return 1;
}

int main(void) {
	std::cout << foo("foo") << std::endl;
	return 0;
}

実装によるのかもしれませんが、
参照とポインタって出力されるコードが同じなのですね。

void foo(const char *str) {
	str[0] + 'a';
}

int main(void) {
	foo("foo");
	return 0;
}
void foo(const char (&str)[4]) {
	str[0] + 'a';
}

int main(void) {
	foo("foo");
	return 0;
}

って感じでgccで試してみましたが、関数シンボルとファイル名しか違いがありませんでした。
アセンブラについてあまり知識はないので割愛