具有类型推导的构造函数中的通用引用

Universal reference in constructor with type deduction

如何在带有类型推导的模板化 class 构造函数中使用普遍的尊重。我尝试了所有选项,但没有任何效果。

考虑示例:

#include <vector>

template<class T> struct A {
    A(T&& a) {  }
};

template<class T> struct B {
    B(T& a) { }
};

template<class T> struct C {
    template<class T2> C(T2&& a) {}
};

template<class T> void foo(T&& a) { }

auto get_r_value() {
    return std::vector<int>(100);
}

std::vector<int>& get_l_value() {
    static std::vector<int> v(100);
    return v;
}

int main() {
    foo(get_r_value()); // ok
    foo(get_l_value()); // ok

    A a1(get_l_value()); // error!
    A a2(get_r_value()); // ok

    B b1(get_l_value()); // ok
    B b2(get_r_value()); // error!

    C c1(get_l_value()); // error!
    C c2(get_r_value()); // error!
}

如果你真的想使用通用引用,你必须使用结构 C,因为在 A 中你实际上声明了一个右值引用,而不是转发(通用)引用。

您可以使用用户定义的 deduction guide

修正 C 的扣除
template <typename T>
C(T&&) -> C<std::remove_cvref_t<T>>;

Example

请注意,演绎指南需要 C++17