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 type
的const char*
全部,因为我不是引用服用.
警告来自两者clang
和g++
编译器.
如何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
-当KeyT
是char*
时,参数声明变char *const cptr
.