关于c ++:分配给返回引用的函数

assigning to a function that returns a reference

我目前正在重构一些代码,我想知道以下内容(例如,为返回引用的函数赋值)是否实际上是错误的样式(至少看起来很奇怪):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>

class A{
    public :
        double & operator()() {
            return this->x;
        };

        double   operator()() const{
            return this->x;
        };

    protected :
        double x = 0.0;
};

int main(){
    A a;
    a() = 4.0;
    std::cout<<a()<<std::endl;  //prints 4.0 as expected.
};

这背后的背景是,我有一些并行工作的代码,使用如下的代码:

1
A.d

不是一种选择,但是:

1
A()

可以,因为我可以将内存选择留给一个函数。

(我知道编码风格是一个有点主观的问题,但我是一名科学家,而不是软件工程师,很感谢良好的实践反馈)


1
a() = 4.0;

这不是一个很坏的做法。每次取消引用一个容器时,都要做一些等效的事情:

1
a[i] = 4.0;

这里,operator[]返回一个引用,您正在分配它。

在这里,operator()可能不是更易读的选择。根据代码的上下文,像operator*之类的东西可能是更好的选择,但这是一个意见问题;)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>

class A{
    public :
        double & operator*() {
            return this->x;
        }

        double   operator*() const{
            return this->x;
        }

    protected :
        double x = 0.0;
};

int main(){
    A a;
    *a = 4.0;
    std::cout<<(*a)<<std::endl;  //prints 4.0 as expected.
};
1
2
3
double & operator()() {
    return this->x;
};

注意,在定义函数时不需要尾随;。做:

1
2
3
4
5
6
7
class A{
    // ...
    double & operator()() {
        return this->x;
    }
    // ...
};

或:

1
2
3
4
5
6
7
8
9
class A{
    // ...
    double & operator()();
    // ...
};

double & A::operator()() {
    return this->x;
}