如何在 C++17 中的 std::array<std::string, N> ¶meter 中实现编译时大小扣除?

Che*_*adu 2 c++ c++17

我正在尝试创建一个最终应该在编译时评估的函数。我遇到的问题是我坚持将初始值设定项列表作为参数传递并自动推断其大小。

我首先尝试创建这个对象:

using namespace std::string_literals;
int main(void)
{
    std::array test = { "Hello"s, "World"s }; // Works perfectly, deduces both std::string type and size
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我创建一个函数并传递初始化列表,我会得到以下结果:

template<size_t N>
void Test(std::array<std::string, N> &argument) { }

using namespace std::string_literals;
int main(void)
{
    Test({ "Hello"s, "World"s }); //Error: could not deduce template argument for N
}
Run Code Online (Sandbox Code Playgroud)

我认为编译器显然应该推断出列表中的元素数量并相应地生成函数定义。我的函数声明有错误吗?如果之前有人问过这个问题,请提前抱歉,c++ 词汇是不明确的......

Nic*_*las 5

Braced-init-lists(这就是所谓的{ "Hello"s, "World"s })不参与函数模板参数推导。前面的代码之所以有效,是因为这是模板参数推导,它具有特殊的规则,允许将花括号初始化列表的直接元素视为假设函数的参数。

最简单的替代方法是强制使用 CTAD:Test(std::array{ "Hello"s, "World"s });。当然,这无论如何都行不通,因为您将参数作为非const引用,但这总是会给您带来麻烦。