如何在类模板中实现"perfect forwarding"?

How do I implement "perfect forwarding" in a class template?

本文关键字:实现 perfect forwarding      更新时间:2023-10-16

我有一个带有模板参数 T 和类型 T 的成员的类模板。我想使用传递给 ctor 的参数初始化该成员,如果它是右值引用并且 T 支持移动语义,我还希望移动传递的参数:

template <typename T>
class C {
public:
    explicit C(T t) : t_(t)
    {
    }
    explicit C(T&& t) : t_(std::move(t))
    {
    }
    ...
 private:    
    T t_;
 };

如果我尝试将右值引用传递给 CTOR,g++ 4.8 会给出以下错误:

int main()
{
    int x = 0;
    C<int> p1{x}; // OK
    C<int> p2{1}; // error g++-4.8: call of overloaded ‘C(<brace-enclosed initializer list>)’ is ambiguous
    return 0;
}

完整的错误文本:

g++-4.8 -std=c++11 -O2 -Wall -pedantic -pthread main.cpp    main.cpp:在函数 'int main()' 中:    main.cpp:23:16:错误:重载的"C()"调用不明确    C p2{1};错误 g++-4.8:重载的"C()"调用不明确              ^    主.cpp:23:16: 注意:候选人是:    main.cpp:12:11: 注意: C::C(T&&&) [与 T = int]      显式 C(T&& t) : t_(std::move(t))               ^    main.cpp:8:14: 注意: C::C(T) [与 T = int]     显式 C(T t) : t_(t)              ^    main.cpp:6:7: 注意: constexpr C::C(const C&)     C 类 {           ^    主.cpp:6:7: 注意: CONSTEXPR C::C(C&&)

有人可以帮我吗?谢谢!

我通过在 C(T t) 常量引用中制作参数 t 来解决这个问题。