Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

12节的描述有问题 #166

Open
Mq-b opened this issue Sep 4, 2023 · 8 comments
Open

12节的描述有问题 #166

Mq-b opened this issue Sep 4, 2023 · 8 comments

Comments

@Mq-b
Copy link

Mq-b commented Sep 4, 2023

我不清楚是原书这样还是翻译,但我看的是你们的,那我就在这里提。
12节中的代码

class Widget {
public:
    using DataType = std::vector<double>;
    …
    DataType& data() &              //对于左值Widgets,
    { return values; }              //返回左值
    
    DataType data() &&              //对于右值Widgets,
    { return std::move(values); }   //返回右值private:
    DataType values;
};

这段代码没问题,但是,下面并没有描述,为什么需要 return std::move(values);
我认为这十分容易被萌新错误的模仿,会在所有的函数下都写成 return std::move
我觉得应该稍微描述一下 数据成员不是隐式可移动实体,如果不std::move,直接return x,重载决议不会选择移动构造

或者至少需要稍微提一下

X foo() {
  X x
  return x
}

class Y {
  X x
  X foo() {
    return x
  }
}

是完全不一样的。

@frederick-vs-ja
Copy link

这肯定是原书的问题,建议给作者发个邮件。
我们可以加个注释,说此处 valuesthis->values,不是局部变量。

@Mq-b
Copy link
Author

Mq-b commented Oct 17, 2023

@frederick-vs-ja 作者邮箱是多少🤣🤣

@frederick-vs-ja
Copy link

@frederick-vs-ja 作者邮箱是多少🤣🤣

[email protected]

@standback
Copy link
Contributor

在这段代码的上面不是有解释 吗?

我们需要的是指明当data被右值Widget对象调用的时候结果也应该是一个右值。现在就可以使用引用限定,为左值Widget和右值Widget写一个data的重载函数来达成这一目的:

@frederick-vs-ja
Copy link

在这段代码的上面不是有解释 吗?

我们需要的是指明当data被右值Widget对象调用的时候结果也应该是一个右值。现在就可以使用引用限定,为左值Widget和右值Widget写一个data的重载函数来达成这一目的:

我们都知道这点。这里可能需要增加的解释是非静态数据成员和局部变量表现不同。

@standback
Copy link
Contributor

可能需要增加的解释是非静态数据成员和局部变

这里我的理解是左值/左值的差别,跟静态还是局部没有关系。

就像书里写的。
widget是左值, 就调用左值 版本的data()&
widget是右值,就调用右值版本的data()&&.

是不是要用move是跟widget是左值,还是右值相关的。

@Mq-b
Copy link
Author

Mq-b commented Feb 5, 2024

可能需要增加的解释是非静态数据成员和局部变

这里我的理解是左值/左值的差别,跟静态还是局部没有关系。

就像书里写的。 widget是左值, 就调用左值 版本的data()& widget是右值,就调用右值版本的data()&&.

是不是要用move是跟widget是左值,还是右值相关的。

我能看懂在于我本来就懂,而非它讲的,已经强调过了,代码,以及注释没问题,但是还不够。

@standback
Copy link
Contributor

可能需要增加的解释是非静态数据成员和局部变

这里我的理解是左值/左值的差别,跟静态还是局部没有关系。
就像书里写的。 widget是左值, 就调用左值 版本的data()& widget是右值,就调用右值版本的data()&&.
是不是要用move是跟widget是左值,还是右值相关的。

我能看懂在于我本来就懂,而非它讲的,已经强调过了,代码,以及注释没问题,但是还不够。

只能说这本书不太适合萌新吧。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants