为什么编译器无法在以下代码中推断出模板参数?我该如何修复代码?我希望添加尽可能低的运行时开销.
#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的上下文中时应用.这些转换是左值到左值的转换,数组到指针的转换,以及函数到指针的转换.这是在按值传递时应用于所有函数参数的类型转换,通常称为参数衰减.
您需要通过引用接受参数:
Test(const char (&data)[N] )
Run Code Online (Sandbox Code Playgroud)
现在N将推断出来.
在您的情况下,参数被值接受,这会导致数组在传递给构造函数时衰减指向数组的第一个元素.