'char*'的模板参数推导

Aru*_*nmu 14 c++ templates c++11

我有以下功能(仅用于复制问题):

template <typename KeyT>
void func(const KeyT cptr) {
  std::cout << typeid(KeyT).name() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我想用字符串文字来调用它,如下所示:

func<char*>("literal");
Run Code Online (Sandbox Code Playgroud)

但是,我最终得到了警告:

warning: ISO C++11 does not allow conversion from string literal to 'char *' [-Wc++11-compat-deprecated-writable-strings]

我有一个特定需要使用char*作为我的主要类型,我期待TAD要考虑param typeconst char*全部,因为我不是引用服用.

警告来自两者clangg++编译器.

如何param type推断这里?

提前致谢.

son*_*yao 12

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

template <typename KeyT>
void func(const KeyT cptr)
Run Code Online (Sandbox Code Playgroud)

注意,它本身const就是限定符KeyT,它意味着if 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数组传递给它,例如:

char my_chararray[] = "literal";
func<char*>(my_chararray); // or just func(my_chararray);
Run Code Online (Sandbox Code Playgroud)


小智 8

这里没有推论:你已明确声明模板参数是char*.

您缺少的是参数替换不是文本搜索和替换:它实际上遵循类型系统的逻辑规则.const KeyT cptr声明了一个const类型的实例KeyT-当KeyTchar*时,参数声明变char *const cptr.