【问题标题】:VS 2013 fails to specialize function template with universal reference and return type depending on template parameterVS 2013 无法根据模板参数专门化具有通用引用和返回类型的函数模板
【发布时间】:2015-02-24 10:39:37
【问题描述】:

VS 2013 说它不能在以下代码中专门化函数模板:

struct W { };

template <class T>
typename T::result_type
f (const W & w, T && t) {
    return 0;
}

/* ... */
struct V { typedef int result_type; };

W w {};
V v {};
f (w, v);

如果我用int 替换typename T::result_type,或者如果我用T&amp; 替换通用引用T&amp;&amp;,它不会抱怨。

在我看来,上面的代码是正确的。这是编译器错误,还是我做错了什么?

【问题讨论】:

    标签: c++ visual-studio-2013 universal-reference


    【解决方案1】:

    编译器是对的。转发引用(1) 的工作方式是,如果传递U 类型的左值,则它们使用U&amp; 而不是U 进行类型推导。由于在您的情况下v 是一个左值,因此T 被推导出为V&amp;V&amp; 是一个引用类型,它没有嵌套类型(甚至不能有嵌套类型)。

    使用转发引用时,您必须始终使用std::remove_reference 来获取底层类型:

    template <class T>
    typename std::remove_reference<T>::type::result_type
    f (const W & w, T && t) {
        return 0;
    }
    

    (1) 自 CppCon 2014 以来,“转发参考”被接受为“通用参考”的替代术语,因为它更好地捕捉了意图。

    【讨论】:

    • 非常感谢!我自己永远不会想到这一点。我会尽快接受你的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多