该对象是const还是左值;无论哪种方式,我们都无法进行分类

时间:2019-04-19 14:23:57

标签: c++

标题引用自 C ++ Primer 5th Edition 。以下代码来自here

#include <vector>
#include <algorithm>
#include <iostream>

class Foo {
public:
    Foo() = default;
    Foo(std::initializer_list<int> il) : data(il) { }

    Foo sorted() &&;
    Foo sorted() const &;

    void print() const;

private:
    std::vector<int> data;
};

Foo Foo::sorted() && {
    std::cout << "Foo Foo::sorted() &&" << std::endl;
    std::sort(data.begin(), data.end());
    return *this;
}

// this object is either const or it is an lvalue; either way we can't sort in place
Foo Foo::sorted() const & {
  std::cout << "Foo Foo::sorted() &" << std::endl;
  Foo ret(*this);
  std::sort(ret.data.begin(), ret.data.end());
  return ret;
}

对于const中出现的Foo Foo::sorted() const &,必须对向量sort进行复制。但是,为什么&也禁止直接使用*this?测试我是否可以直接使用*this而不使用const。我编写以下代码。

#include <vector>
#include <algorithm>
#include <iostream>

class Foo {
public:
    Foo() = default;
    Foo(std::initializer_list<int> il) : data(il) { }

    Foo sorted() &&;
    Foo sorted() &;

    void print() const;

private:
    std::vector<int> data;
};

Foo Foo::sorted() && {
    std::cout << "Foo Foo::sorted() &&" << std::endl;
    std::sort(data.begin(), data.end());
    return *this;
}


Foo Foo::sorted() & {
  std::cout << "Foo Foo::sorted() &" << std::endl;
  std::sort((*this).data.begin(),(*this).data.end());
  return *this;
}

void Foo::print() const {
    std::cout << "<" << this << ">";
    for (const auto &i : data)
        std::cout << " " << i;
    std::cout << std::endl;
}

int main() {
    Foo f1; f1.print();
    Foo f2 { 9, 2, 6, 5, 3, 8, 4, 1, 7 }; f2.print();
    Foo f3 = f2.sorted(); f2.print(); f3.print();
    Foo f4 = Foo({ 2, 6, 5, 3, 8, 4, 1, 7 }).sorted(); f4.print();

    return 0;
}

const已从Foo sorted() &中删除,看来没有什么错。作者说:“这是一个左值;无论哪种方式,我们都无法进行分类”。但是如果删除const,我会对其进行排序。为什么作者说我们不能?有什么我想念或误解了作者的话吗?

0 个答案:

没有答案