整数和常量字符[N]上的模板未编译(无法推断模板参数"N")

Templates on integers and const char[N] aren't compiling (couldn't infer template argument 'N')

本文关键字:参数 编译 字符 常量 整数      更新时间:2023-10-16

为什么编译器不能在下面的代码中推断模板参数?我如何修复代码?我想添加尽可能低的运行时开销。

#include <iostream>
using namespace std;
struct Test
{
    template<int N>
    Test(const char data[N]) :
        data(data),
        size(N)
    {}
    const char *data;
    int size;
};
int main()
{
    Test test("Foobar");
    return 0;
}

我试图使代码片段尽可能的小和可读。

pos-reply更新:

c++ K-ballo故事中的解释可能会有用:

左值转换,当在需要右值的上下文中使用左值参数时应用。这些转换是左值到右值的转换数组到指针的转换,以及函数到指针的转换。这是按值传递时应用于所有函数实参的类型转换,通常称为实参衰减。

您需要通过引用接受参数:

Test(const char (&data)[N] ) 

现在将推断N

在你的例子中,参数被value接受,当它被传递给构造函数时,会导致数组衰减为指向数组第一个元素的指针。