C++ const 引用模板函数参数类型本身就是一个引用,为什么?[已结束]

C++ const reference template function argument type is itself a reference, why? [closed]

提问人:111111 提问时间:11/10/2020 更新时间:11/10/2020 访问量:583

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将有助于其他人回答这个问题。

3年前关闭。

我有以下功能:

template<typename T>
void f(const T& val) {
    using value_type = T;
    using sub_type = typename value_type::sub_type;
    //etc...
}

但是,我遇到了一个问题,即编译器告诉我 T 不是事实,无论它是什么类型,而是对它的引用。这怎么可能,在什么情况下,const-references 的模板参数本身就是引用?

请注意,我可以通过以下方法解决上述问题:

    using value_type = std::remove_reference_t<T>;

但我想知道 T 本身在什么情况下可以作为参考。

C++ 模板 C++20 pass-by-const-reference

评论


答:

3赞 Barry 11/10/2020 #1

这怎么可能,在什么情况下,const-references 的模板参数本身就是引用?

这些东西是独立的。我们有一个模板参数 .然后我们有一个函数参数,恰好是 .但两者并没有联系在一起。TT const&

虽然永远不会根据该函数参数推导出为引用类型,但导并不是提供模板参数的唯一方法:T

template <typename T>
void f(T const& val);

void g(int i) {
    f<int&>(i);
}

在这里,我明确地提供了 的模板参数,它不是推导的。,这里,将是(不是),实际上甚至不是对这里的引用,它实际上是一个(不是)。int&TTint&intvalconstint&int const&

当然,典型的用法是(没有明确的模板参数),它将推断为 和 have 的类型。f(i)Tintvalint const&

评论

0赞 111111 11/10/2020
我会检查调用站点,但我认为它们中的任何一个都没有明确指定类型。我在 clang 和 gcc 上都遇到了类似的错误,所以我很确定是我的代码出了问题。
5赞 Barry 11/10/2020
@111111这就是为什么我们在“如何询问”中要求提供最小可重复示例的原因。
0赞 NoSenseEtAl 11/11/2020
@Barry很难猜测 op 问题是什么,但是当类型被推断为引用时,一种常见的情况是当函数的参数是通用/转发引用时,可能有问题的源代码没有从真实代码中正确简化......