'char*' 的模板参数推导

阿润木

我有以下功能(仅用于重现问题):

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 typeconst char*全部,因为我不是引用服用。

clangg++编译器都带有警告

param type这里是如何推导出来的?

提前致谢。

songyuanyao

我期待TAD将 param 类型视为 const char* ... 这里
如何推导出 param 类型?

template <typename KeyT>
void func(const KeyT cptr)

请注意,constKeyT自身的限定符,这意味着如果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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

'char *'的模板参数推导

来自分类Dev

'char (*RtlpNumberOf(T (&)[N]))[N]': 无法从 'char *' 推导出 'T (&)[N]' 的模板参数

来自分类Dev

不能从const char *推导std :: basic_string作为功能模板的参数

来自分类Dev

推导模板参数的模板参数

来自分类Dev

模板参数推导顺序

来自分类Dev

模板参数推导失败

来自分类Dev

模板参数类型推导

来自分类Dev

模板参数推导顺序

来自分类Dev

模板参数推导C ++

来自分类Dev

模板参数推导C ++

来自分类Dev

模板函数参数推导

来自分类Dev

模板模板参数推导指南

来自分类Dev

const参数的模板参数推导

来自分类Dev

从默认参数推导模板参数

来自分类Dev

模板相关参数的类模板参数推导

来自分类Dev

数组类型的模板参数推导

来自分类Dev

模板参数推导失败,SFINAE

来自分类Dev

RAII和推导的模板参数

来自分类Dev

从继承类型推导模板参数

来自分类Dev

std :: function模板参数推导

来自分类Dev

推导参考模板参数的类型

来自分类Dev

模板参数包的错误推导

来自分类Dev

隐式对的模板参数推导

来自分类Dev

从继承类型推导模板参数

来自分类Dev

模板参数推导出错

来自分类Dev

模板参数推导失败,typedef?

来自分类Dev

模板模板函数中的默认const char *模板参数

来自分类Dev

'char const * str'作为模板参数

来自分类Dev

具有模板参数大小的const char数组与char指针