【发布时间】:2014-03-08 08:51:55
【问题描述】:
更新:看来是我的错,我没有正确安装 CTP。 MS 无法重现该错误。
我想将一个变量从派生类移动到我的基类(它们之间有多个类)
通常,我会通过 const& 传递参数,但我试图通过值传递它并将其向下移动,避免复制。
这是我的课程:
#include <string>
class base {
public:
explicit base(std::string url) : url_{std::move(url)} {}
// prevent copy
base(const base&) = delete;
base& operator=(const base&) = delete;
virtual ~base() {}
protected:
std::string url_;
};
class derived : public base {
public:
using base::base;
};
class derived_final : public derived {
public:
using derived::derived;
explicit derived_final(std::string url) :
derived{std::move(url)}
{
// do some stuff
}
};
int main() {
derived_final df { "test" };
}
还有日志:
e:\project\test\main.cpp(25) : error C2664: 'derived::derived(const derived &)': cannot convert argument 1 from 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>' to 'const derived &'
Reason: cannot convert from 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>' to 'const derived'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
我还尝试向 base 添加一个移动构造函数,以及一个 op=。
但是当我尝试将 url 移动到 derived_final 的构造函数中的派生时,derived_final 尝试使用以 std::string 作为参数的派生复制构造函数。
任何想法为什么会发生这种情况? 我正在使用带有 CTP 的 msvc 2013(用于“使用”支持)。
来源:https://bitbucket.org/syl/c-11-inherited-constructor-and-move/src
【问题讨论】:
-
你能把
main()也包括进来吗?我问是因为使用 uniform-initderived_final df{ "test" };我没有收到这样无效的 copy-ctor 消息。而且我不完全清楚你为什么不首先对这些 args 使用 rval-refs。 -
这里的问题不是你做
using derived::derived;以及定义explicit derived_final(std::string url)- 这不是让derived_final中的两个ctors 具有完全相同的签名吗?我还没用过这个功能 -
我用完整列表和错误消息更新了帖子。我试图删除“显式”,但我仍然得到同样的错误。 @WhozCraig 我也尝试添加一个右值构造函数,仍然是同样的错误。它仍在尝试使用 (const derived&)
-
那么 this pukes 在 VS2013 上?多么奇怪。也许this doesn't?
-
两者都做,该死的...... CTP 处于 alpha/beta 阶段,也许这就是原因。
标签: c++ inheritance c++11