将数组模板参数用于 Return

Using the Array Template Parameter for a Return

(我似乎找不到这个范式的名称,但如果可以的话,你会得到一个额外的投票!)这个模板范式用于防止数组衰减为指针:

template <size_t N>
void foo(const char (&bar) [N]);

Live Example

我们可以在 foo 的正文中使用 N 来减小尺寸 bar。给定 const char array[] = "lorem ipsum" 我们使用此调用 foo(array)bar 定义为 const char (&) [12],有效地以一个价格传递 2 个参数。


我想在 return 中使用同样的想法,例如:

template <size_t N>
const char (&) [N] foo(const char (&bar) [N]);

这样我就可以传递数组,并有另一个对它的引用,例如:auto result = foo(bar)

我这里的代码产生错误:

unrecognizable template declaration/definition

这可能吗?

编辑:

为澄清起见,我希望能够有一个函数 return,其结果相当于:

auto& result = bar;

这样 result 将是 const char (&) [*],其中 *bar 的大小。

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 is passed by reference”,尽管更有眼光的用户可能会说 "passed as an lvalue"(并且原样返回)。