(我似乎找不到这个范例的名称,但如果可以的话,你会得到一个奖励upvote!)这个模板范例用于防止数组衰变为指针:
template <size_t N>
void foo(const char (&bar) [N]);
我们可以在N
的正文中使用foo
来缩小bar
的大小。鉴于const char array[] = "lorem ipsum"
,我们使用此调用foo(array)
将bar
定义为const char (&) [12]
,有效地传递2个参数,价格为1。
我想使用同样的想法,但在回报中,例如:
template <size_t N>
const char (&) [N] foo(const char (&bar) [N]);
这样我就可以传递数组,并对其进行另一次引用,例如:auto result = foo(bar)
我在这里的代码会产生错误:
无法识别的模板声明/定义
这可能吗?
修改
为了澄清,我希望能够有一个函数返回,它将导致相当于:
auto& result = bar;
这样result
将是const char (&) [*]
,其中*
的大小为bar
。
答案 0 :(得分:4)
C ++语法很精彩:
template <std::size_t N>
const char (&f(const char (&arr)[N]))[N] // take that, Lisp
{
return arr;
}
对于较少自虐:
template <std::size_t N> using CarrN = const char[N];
template <std::size_t N>
CarrN<N> & f(CarrN<N> & arr)
{
return arr;
}
关于术语:我们通常说“arr
通过引用传递”,尽管更挑剔的用户可能会说“作为左值传递”(并且也会这样返回)