我在这里阅读了关于类模板的模板参数推导的论文http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0091r3.html。这个特性在 C++17 标准中,有些事情让我很困惑。
template <typename T>
class Something {
public:
// delete the copy and move constructors for simplicity
Something(const Something&) = delete;
Something(Something&&) = delete;
explicit Something(T&&) { ... }
explicit Something(const T&) { ... }
template <typename U, typename EnableIfNotT<U, T>* = nullptr>
Something(U&&) { ... }
};
给定上面的代码,如果有人试图像这样实例化上面模板的一个实例
auto something = Something{std::shared_ptr<int>{}};
将始终调用右值引用重载吗?由于考虑扣除的过载集是
template <typename T>
Something<T> F(T&&) { ... }
template <typename T>
Something<T> F(const T&) { ... }
template <typename T, typename U, typename EnableIfNotT<U, T>*>
Something<T> F(U&&) { ... }
- 第二个重载永远不会优于第一个(因为现在是转发引用重载,而不是右值引用重载),那么这里应该发生什么?
- 如果没有明确指定参数,似乎永远无法调用最后一个
T
,这是预期的行为吗? - 在对类模板使用模板参数推导时,是否还有其他任何问题或样式指南需要牢记?
- 此外,用户定义的扣除指南是否需要在类定义之后?例如,您可以在类定义本身的类构造函数声明中使用尾随返回类型吗?(不像这里的迭代器构造函数http://en.cppreference.com/w/cpp/language/class_template_deduction)