如何在类模板中实现“完美转发”?

时间:2013-11-06 09:54:48

标签: c++ templates c++11

我有一个带有模板参数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_;
 };
如果我尝试将rvalue引用传递给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: In function ‘int main()’:
    main.cpp:23:16: error: call of overloaded ‘C()’ is ambiguous
    C p2{1}; // error g++-4.8: call of overloaded ‘C()’ is ambiguous
              ^
    main.cpp:23:16: note: candidates are:
    main.cpp:12:11: note: C::C(T&&) [with T = int]
      explicit C(T&& t) : t_(std::move(t))
               ^
    main.cpp:8:14: note: C::C(T) [with T = int]
     explicit C(T t) : t_(t)
              ^
    main.cpp:6:7: note: constexpr C::C(const C&)
     class C {
           ^
    main.cpp:6:7: note: constexpr C::C(C&&)
有人可以帮帮我吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

我通过在C(T t)const引用中设置参数t来解决问题。