整数和const char [N]上的模板没有编译(无法推断模板参数'N')

vin*_*ker 2 c++ templates

为什么编译器无法在以下代码中推断出模板参数?我该如何修复代码?我希望添加尽可能低的运行时开销.

#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;
}
Run Code Online (Sandbox Code Playgroud)

我试图让代码片段尽可能小且易读.

pos-reply UPDATE:

来自Tales of C++ K-ballo的解释可能很有用:

Lvalue转换,在lvalue参数用于预期rvalue的上下文中时应用.这些转换是左值到左值的转换,数组到指针的转换,以及函数到指针的转换.这是在按值传递时应用于所有函数参数的类型转换,通常称为参数衰减.

Naw*_*waz 8

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

Test(const char (&data)[N] ) 
Run Code Online (Sandbox Code Playgroud)

现在N将推断出来.

在您的情况下,参数被值接受,这会导致数组在传递给构造函数时衰减指向数组的第一个元素.