考虑这个简单的功能
template<typename T>
void func(const T& x) {std::cout<< typeid(T).name();}
现在,如果我调用函数func("ddd")
,T会推导出什么? 。如果const
的参数中没有func
,则T
只是char [4]
,让我感到困惑的是添加const
,是什么T推断为?
是:const char [4]
。如果我将参数更改为T const &x
(即const
的更改顺序),则扣除会产生T
到char const [4]
吗?
任何人都可以用字符串文字解释参数演绎吗?
答案 0 :(得分:1)
字符串文字是const字符的数组。
对4个字符串的字符串文字的引用属于char const (&)[4]
类型。
const char [4]
和char const [4]
属于同一类型!
char const (&)[N]
,const char [N]
和char const [N]
全部推断为char const [N]
#include <iostream>
template<typename T>
void func1(T& x) {std::cout<< typeid(T).name()<<std::endl;}
template<typename T>
void func2(const T& x) {std::cout<< typeid(T).name()<<std::endl;}
template<typename T>
void func3(T const &x) {std::cout<< typeid(T).name()<<std::endl;}
int main()
{
char c[4]= {'a','b','c','d'};
const char c1[4]= {'a','b','c','d'};
char const c2[4]= {'a','b','c','d'};
func1("abcd"); //prints char const [4]
func1(c); //prints char [4]
func1(c1); //prints char const [4]
func1(c2); //prints char const [4]
func2("abcd"); //prints char const [4]
func2(c); //prints char [4]
func2(c1); //prints char const [4]
func2(c2); //prints char const [4]
func3("abcd"); //prints char const [4]
func3(c); //prints char [4]
func3(c1); //prints char const [4]
func3(c2); //prints char const [4]
return 0;
}
答案 1 :(得分:0)
现在如果我调用函数func(),T推导出什么?
如果您使用字符串文字调用,则T
会推断为char const[N]
。
如果func参数中没有const,则T将只是char [4]
如果您的意思是如果您将参数声明为T& x
,那么如果您使用字符串文字进行调用,则仍然会将T
推断为char const[N]
。
如果你的意思是用非const数组调用func
,那么是:T
将推断为非const。
如果我将参数更改为T const&amp; x
这没有任何改变,因为const T &
只是写T const &
的另一种方式。
答案 2 :(得分:0)
const
通常指的是前面的:
char const *
- 指向常量字符
char * const
- 指向char的常量指针
char const * const
- 指向常量char的常量指针
char Foo::bar() const
- 常量成员函数返回char
等
前导 const
是一个可以追溯到C早期的例外:
const char *
&lt; =&gt; char const *
因此,更改模板中的顺序根本不会更改类型(T const &
&lt; =&gt; const T &
)。
如果您想要一致关于const
展示位置,请专门使用尾随类型,因为这是您 放置const
的唯一方式一致。