【问题标题】:Loop for in range of initializer_list在 initializer_list 范围内循环
【发布时间】:2017-03-15 21:52:51
【问题描述】:
Library::Library(std::initializer_list<Book> list) 
    : size{ list.size() }
{
    std::size_t i = 0;
    for (Book b : list)
    {
       insertBook(actual, b);
       actual = next(actual);
       size++;
    }
}

还有错误:

“正在初始化”:无法从“const Book”转换为“Book”

和:

由于复制构造函数不明确或没有,无法复制构造类“Book” 可用的复制构造函数

我的 book.h 构造函数

Book();
Book& operator=(Book& old);
Book& operator=(Book&& old);
Book(std::string& author, std::string& title) :author(author), title(title)
{
    std::cout << "l-Referencja" << std::endl;
}
Book(std::string&& author, std::string&& title) :author(author), title(title) 
{
    std::cout << "r-Referencja" << std::endl;
}
Book(Book& old);
Book(Book&& old);

【问题讨论】:

  • 发布可编译代码。
  • Book&amp; operator=(const Book&amp; old)Book(const Book&amp; old);
  • 您的标题具有误导性。 初始化器列表中没有循环。 构造函数中有一个循环。初始化列表是:: size { list.size() }
  • 你有一个真的奇怪的复制构造函数。

标签: c++ object initializer-list


【解决方案1】:

std::initializer_list&lt;T&gt; 的迭代器是 const T*,因此基于范围的循环产生 const T 的值,或者在您的情况下为 const Book

然而,您的类Book不能从常量值构造,因为它的复制和移动构造函数都需要可变值。

您要么不能使用初始化列表来传达Books 的列表,要么需要重新设计您的类,以便它可以从一个常量值构造。

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2013-07-15
    • 2013-02-25
    • 1970-01-01
    相关资源
    最近更新 更多