我最近在尝试使用完美的转发构造函数实现类层次结构时遇到了问题.请考虑以下示例:
struct TestBase {
template<typename T>
explicit TestBase(T&& t) : s(std::forward<T>(t)) {} // Compiler refers to this line in the error message
TestBase(const TestBase& other) : s(other.s) {}
std::string s;
};
struct Test : public TestBase {
template<typename T>
explicit Test(T&& t) : TestBase(std::forward<T>(t)) {}
Test(const Test& other) : TestBase(other) {}
};
Run Code Online (Sandbox Code Playgroud)
当我尝试编译代码时,我收到以下错误:
错误3错误C2664:'std :: basic_string <_Elem,_Traits,_Alloc> :: basic_string(const std :: basic_string <_Elem,_Traits,_Alloc>&)':无法将参数1从'const Test'转换为'const std :: basic_string <_Elem,_Traits,_Alloc>&'
我的理解是编译器将完美的转发构造函数视为比复制构造函数更好的数学.例如,参见Scott Meyers:C++ 11中的复制构造函数.在没有类层次结构的其他实现中,我可以通过SFINAE禁用完美转发构造函数作为复制构造函数.例如,参见Martinho Fernandes:转发构造函数的一些缺陷.当我尝试将上述解决方案应用于此示例时,我仍然无法使用相同的错误消息进行编译.
我认为一种可能的解决方案是避免完美转发,在构造函数中按值获取参数,然后从它们移动到类变量.
所以我的问题是,如果这个问题有其他一些解决方案,或者在这种情况下是否完全转发?
更新: 原来我的问题很容易被误解.所以我会尝试澄清我的意图和背景. …