c++ - 'char*'的模板参数推导

标签 c++ templates c++11

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

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

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

func<char*>("literal");

但是,我最终得到以下警告:

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

我特别需要使用 char* 作为我的 Key 类型,我期望 TADparam type 视为 const char* 整体,因为我没有引用它。

警告来自 clangg++ 编译器。

这里的param type是怎么推导出来的?

提前致谢。

最佳答案

I was expecting TAD to consider the param type as const char* ...
How is the param type being deduced here ?

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 数组传递给它,例如:

char my_chararray[] = "literal";
func<char*>(my_chararray); // or just func(my_chararray);

关于c++ - 'char*'的模板参数推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37642048/

相关文章:

c++ - 该计划是否违反 ODR?

c++ - 从 nullptr 推导的指向模板类型?

c++ - 以类实例为右侧的运算符重载

c++ - 来自 std::promise 的未知异常

c++ - Boost_program_option 链接器错误甚至存在 "boost_program_options"

c++ - 在 C++ 中保存指向文件的指针

python - block 中的 Django 模板翻译是不可能的

c++ - 未作为最后一个参数传递时模板参数包扣除

c++ - C++11 lambda 表达式背后的动机是什么?

c++ - QStyledItemDelegate::paint - 为什么我的文本没有正确对齐?