【发布时间】:2018-11-22 16:14:10
【问题描述】:
有很多关于模板参数推导的讨论和澄清,特别是引用折叠和“通用引用”。这个问题涉及到相关的细节:How does auto deduce type?,Scott Meyers 的这篇论文更详细,也许提供了更多的例子和更广泛的背景:https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers,他的 cppcon 幻灯片:http://www.aristeia.com/TalkNotes/C++TypeDeductionandWhyYouCareCppCon2014.pdf。
我的问题涉及以下代码:
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
}
为什么我的模板函数f 没有推断出他们键入int &?根据 Scott Meyers 的幻灯片(幻灯片 7),ir 是左值引用这一事实被简单地忽略。这完美地解释了这种行为,但为了完美地解释,我花了一些时间阅读参考和标准,试图找到它所说的类似:
如果A是引用类型,则推导使用引用类型。
这是参考的旧离线版本(我通常使用)所说的,尽管它在标题 Conversion Function Template 下说,我在标准。我发现的关闭我认为来自重载模板的部分排序规则,但我不相信它会适用于这里,即使它是我正在寻找的。
标准中是否有指定此行为的地方,或者它是否被我忽略的其他行为所暗示?我真的很想能够告诉某人“因为这里的标准中的这些词,所以不能推断出
int & 类型。”
【问题讨论】:
-
在我的手机上,所以我无法查找,但我相信您正在搜索的措辞是它忽略了顶级 cv-ref 限定符。对我来说,这是执行此操作的自然方式,因为函数看起来像是按值传递,如果对于某些类型它通过引用传递,那将是非常令人惊讶的。
标签: c++ reference standards lvalue template-argument-deduction