C++ 继承的构造函数(使用)和移动

C++ 继承的构造函数(使用)和移动,c++,inheritance,c++11,C++,Inheritance,C++11,更新:似乎是我的错,我没有正确安装CTP。MS无法复制错误。 我想将一个变量从派生类移到基类(它们之间有多个类) 通常,我会通过const&传递参数,但我试图通过值传递参数,并将其向下移动到层次结构中,以避免复制 以下是我的课程: #include <string> class base { public: explicit base(std::string url) : url_{std::move(url)} {} // prevent copy ba

更新:似乎是我的错,我没有正确安装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" };
}
#包括
阶级基础{
公众:
显式基(std::stringurl):url{std::move(url)}{
//防止复制
基(常数基&)=删除;
基本运算符=(常量基本运算符=)=删除;
虚拟~base(){}
受保护的:
std::字符串url;
};
派生类:公共基{
公众:
使用base::base;
};
类派生\u final:公共派生{
公众:
使用派生::派生;
显式派生_final(标准::字符串url):
派生的{std::move(url)}
{
//做点什么
}
};
int main(){
派生的_finaldf{“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
e:\project\test\main.cpp(25):错误C2664:'derived::derived(const-derived&'):无法将参数1从'std::basic_string'转换为'const-derived&'
原因:无法从“std::basic_string”转换为“const-derived”
没有可执行此转换的用户定义的转换运算符,或者无法调用该运算符
我还尝试向base添加一个move构造函数,以及一个op=

但当我尝试将url移动到派生的final构造函数中的派生时,派生的final尝试使用派生的copy构造函数,并将std::string作为参数

知道为什么会这样吗? 我正在使用msvc 2013和CTP(用于“使用”支持)


来源:似乎是MSVC的一个bug。GCC报告没有错误。

您是否也可以包括
main()
?我这样问是因为使用统一init
派生的_finaldf{“test”}我没有收到这样的无效复制消息。我不完全清楚为什么不首先对这些参数使用rval REF
以及定义
显式派生\u final(std::string url)
-这难道不会使
派生\u final
中的两个ctor具有完全相同的签名吗?我还没有使用这个功能,雪人用完整的列表和错误消息更新了帖子。我试图删除“explicit”,但仍然得到相同的错误@WhozCraig我还试图添加一个右值构造函数,仍然是相同的错误。它仍在尝试在VS2013上使用(const派生的&)So?真奇怪。也许吧?两者都有,该死的。。。CTP是alpha/beta版本,也许这就是原因。我在2013年11月安装了CTP:我们回到了“MSCV bug”状态:)