如何在类模板中实现"perfect forwarding"?
How do I implement "perfect forwarding" in a class template?
我有一个带有模板参数 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 来解决这个问题。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- 如何在类模板中实现"perfect forwarding"?