继承构造函数(使用)并移动

时间:2014-02-10 20:20:06

标签: c++ inheritance c++11

更新:看来这是我的错,我没有正确安装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

我还尝试将移动构造函数添加到基础,以及op =。

但是当我尝试将url移动到derived_final的构造函数中派生时,derived_final尝试使用派生的复制构造函数和std :: string作为参数。

为什么会发生这种情况? 我正在使用带有CTP的msvc 2013(用于“使用”支持)。

来源:https://bitbucket.org/syl/c-11-inherited-constructor-and-move/src

1 个答案:

答案 0 :(得分:0)

似乎是一个MSVC错误。 GCC报告没有错误。