gpt4 book ai didi

c++ - 模板推导中的const T&和T&有什么区别

转载 作者:太空狗 更新时间:2023-10-29 22:54:33 27 4
gpt4 key购买 nike

#for example:

#1:
template <typename T>
void func(T &) {}
int a;
const int b;
func(a); // T -> int
func(b); // T -> const int
func(5); // wrong. 5 is a right value

#2:
template <typename T>
void func(const T &) {}
int a;
const int b;
func(a); // T -> int
func(b); // T -> int
func(5); // T -> int

#3
template <typename T>
void func(T &&) {}
func(5); // T -> int

我的问题是:

为什么第一个代码不起作用,为什么这与左/右值有关;

为什么第三行的 T 不是 const int

最佳答案

why the 1'st code doesn't work;Why this is related to left/right value;

对于第一种情况,T会被推导为int,那么参数类型为int &,是一个左值引用到非常量。 5 是一个右值,它不能绑定(bind)到非常量的左值引用,然后调用失败。

对于第二种情况,函数的参数类型是 const int &,即对 const 的左值引用,它可以像 5 一样绑定(bind)到右值。

why T in the 3'rd is not const int

如果参数不是const 类型,则模板参数推导不会添加 const5int 类型(并且是右值),但它的类型不是 const int

另一方面,我们有forwarding reference用于处理左值/右值。例如

template <typename T>
void func(T &&) {}
int a;
const int b;
func(a); // T -> int&; parameter type -> int&
func(b); // T -> const int&; parameter type -> const int&
func(5); // Fine. T -> int; paramter type -> int&&

关于c++ - 模板推导中的const T&和T&有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55217376/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com