【问题标题】:Inherited constructor (using) and move继承的构造函数(使用)和移动
【发布时间】: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-init derived_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


【解决方案1】:

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

【讨论】:

猜你喜欢
  • 2013-02-27
  • 2012-04-24
  • 1970-01-01
  • 2014-11-22
  • 2016-03-24
  • 2017-11-15
  • 2011-12-27
  • 2017-11-17
相关资源
最近更新 更多