我有以下功能(仅用于重现问题):
template <typename KeyT>
void func(const KeyT cptr) {
std::cout << typeid(KeyT).name() << std::endl;
}
我想用字符串文字来调用它,如下所示:
func<char*>("literal");
但是,我最终得到以下警告:
警告:ISO C++11 不允许从字符串文字转换为 'char *' [-Wc++11-compat-deprecated-writable-strings]
我有一个特定需要使用char*
作为我的主要类型,我期待TAD
要考虑param type
的const char*
全部,因为我不是引用服用。
clang
和g++
编译器都带有警告。
param type
这里是如何推导出来的?
提前致谢。
我期待
TAD
将 param 类型视为 const char* ... 这里
如何推导出 param 类型?
template <typename KeyT>
void func(const KeyT cptr)
请注意,const
是KeyT
自身的限定符,这意味着如果KeyT
是指针,cptr
则将是 const 指针,而不是指向 const 的指针。
"literal"
是类型为 的字符串文字const char[8]
,可能会衰减到const char*
. 那么KeyT
可能被推导出为const char*
,那么类型cptr
将是const char* const
。
你指定的模板参数类型char*
,然后做cptr
一个char* const
。但是从 C++11 开始,char*
不允许将字符串文字转换为隐式,因为文字是const
.
为什么你需要模板参数类型是char*
?在函数内部修改它?请注意,修改字符串文字将导致 UB。您可以将一个字符数组传递给它,例如:
char my_chararray[] = "literal";
func<char*>(my_chararray); // or just func(my_chararray);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句