标题引用自 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,我会对其进行排序。为什么作者说我们不能?有什么我想念或误解了作者的话吗?