【发布时间】:2022-01-23 10:54:24
【问题描述】:
关于转发引用(又名通用引用)的全部前提是,这个函数:
template<typename T>
void f(T&&) { }
可以导致模板参数为int& 或int,具体取决于您是否以int a{}; f(a) 或f(5) 为例。但这已经是我认为的一步太远了。因为当我有这样的功能时
template<typename T>
auto g(T) -> void {}
然后它总是将模板参数解析为int,不管我如何称呼它。尽管auto h(int&) -> void {} 是完全合法的。
那么,有哪些规则允许f 的模板参数作为参考,而不是g 的模板参数?
【问题讨论】:
-
我假设您已经阅读了en.cppreference.com/w/cpp/language/reference 那么,还有什么不清楚的地方?我不是在讽刺。我发现很多关于这件事的文字我自己都不清楚,但为了写出一个好的答案,了解你在哪里遇到了困难。
-
我会通读一遍,但我认为问题很清楚?为什么 f 的模板参数在使用左值调用时会解析为 T& 而 g 不是?
-
@Basti 因为它不能。
T只是一个typename。它不会自动包含&。为此,您需要输入&或&&,如g(T&)。 -
当使用 T&& 参数时,T 确实变成了 T& - 这就是重点
标签: c++ templates forwarding-reference