我有一个带有模板参数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&&)有人可以帮帮我吗? 谢谢!
答案 0 :(得分:0)
我通过在C(T t)const引用中设置参数t来解决问题。