我有一个我希望为const char*
工作的函数,但它只适用于字符串文字,因为它们被赋予一个特殊的规则来允许初始化数组。对于字符串文字和foo(const char*)
,第二个重载const char*
将是首选,但我的模板重载不适用于const char*
。
// Errors for const char*.
template<typename T, size_t n>
void foo(const T (&s)[n])
{
}
// Selected both times if both overloads are present.
void foo(const char*)
{
}
int main()
{
foo("hello");
const char* s = "hello";
foo(s); // Error if foo(const char*) is absent.
}
有没有办法允许const char*
初始化数组?
我试过这个:
template<typename T, size_t n>
void _foo(const T (&s)[n])
{
std::cout << __PRETTY_FUNCTION__;
}
#define _expand(s) #s
#define expand(s) _expand(s)
void foo(const char* s)
{
_foo(expand(s));
}
答案 0 :(得分:0)
我认为
const char* s = "hello";
是指向只读内存中某个字符串文字的指针,编译器无法推断出数组大小,因此选择第二次重载。
您可以使用
const char s[] = "hello";
答案 1 :(得分:0)
不,你不能用指针初始化数组。字符串文字语法是const char s[]
的特殊简写,您的工作代码大致相当于
static const char s[]{'h','e','l','l','o','\0'};
foo(s);
因此,您可以将数组传递给模板函数,包括字符串文字,但是您不能传递指针,包括指向字符串文字的指针。
另一方面,数组可以衰减为指针,这就是为什么数组和指针都可以传递给你的第二个重载。