【问题标题】:C++ const reference template function argument type is itself a reference, why? [closed]C++ const 引用模板函数参数类型本身就是一个引用,为什么? [关闭]
【发布时间】:2020-11-09 22:57:05
【问题描述】:

我有以下功能:

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++ templates c++20 const-reference pass-by-const-reference


    【解决方案1】:

    这怎么可能,在什么情况下 const-references 的模板参数自己引用?

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

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

    template <typename T>
    void f(T const& val);
    
    void g(int i) {
        f<int&>(i);
    }
    

    这里,我明确提供int&amp; 作为T 的模板参数,它没有被推导出来。 T,在这里,将是int&amp;(不是int),实际上val 甚至不是对const 的引用,它实际上是int&amp;(不是int const&amp;)。

    当然,典型的用法只是f(i)(没有显式模板参数),它会将T 推导出为int,并且val 的类型为int const&amp;

    【讨论】:

    • 我会检查调用站点,但我认为它们中的任何一个都没有明确指定类型。我在使用 clang 和 gcc 时遇到了类似的错误,所以我很确定是我的代码出错了。
    • @111111 这就是我们在How to Ask 中要求minimal reproducible example 的原因。
    • @Barry 很难猜出操作问题是什么,但类型被推断为引用的一种常见情况是函数的参数是通用/转发引用时,可能有问题的源没有正确减少来自真实代码...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    相关资源
    最近更新 更多