C++ 左值引用类型的推导
关于模板参数推导,特别是引用折叠和“通用引用”,有很多讨论和澄清。这个问题涉及相关细节:,Scott Meyers的这篇文章更详细,可能给出了更多示例和更广泛的上下文:,以及他的cppcon幻灯片:C++ 左值引用类型的推导,c++,reference,standards,lvalue,template-argument-deduction,C++,Reference,Standards,Lvalue,Template Argument Deduction,关于模板参数推导,特别是引用折叠和“通用引用”,有很多讨论和澄清。这个问题涉及相关细节:,Scott Meyers的这篇文章更详细,可能给出了更多示例和更广泛的上下文:,以及他的cppcon幻灯片: 我的问题涉及以下代码: template <typename T> void f(T t) { t = 0; } int main() { int i{5}; int &ir{i}; f(ir); cout << i << endl; /
我的问题涉及以下代码:
template <typename T> void f(T t) { t = 0; }
int main() {
int i{5};
int &ir{i};
f(ir);
cout << i << endl; // 5
f<decltype(ir)>(ir);
cout << i << endl; // 0
}
template void f(T T){T=0;}
int main(){
int i{5};
int&ir{i};
f(ir);
在C++中没有引用类型的表达式。变量<代码> IR > >是代码> int和<代码>,但是表达式的类型<代码> IR >是代码> int <代码>。后一类型用于类型推导,因为函数参数总是表达式(除了在支持的init列表的特殊情况下除外)。
看
如果表达式最初具有类型“reference toT
”([dcl.ref],[dcl.init.ref]),则在进行任何进一步分析之前,该类型将调整为T
。
表达式指定由引用表示的对象或函数,表达式是左值或x值,具体取决于表达式
在我的手机上,所以我无法查找它,但我相信您正在搜索的措辞是它忽略了顶级cv ref限定符。对我来说,这是一种自然的方式,因为函数看起来像是通过值传递的,如果某些类型的函数是通过引用传递的,这将非常令人惊讶。我觉得有点傻,当我阅读它时,我忽略了这一点,b这解决了我的很多问题。我可以吻你,但请接受真诚的感谢。