Const成员函数vs const返回类型

时间:2014-06-16 08:11:09

标签: const d

在D中我可以指定const函数,就像在c ++中一样:

struct Person {
    string name;

    // these two are the same?
    const string getConstName() { return name; }     
    string getConstName2() const { return name; }   
}

似乎上述两个含义相同。这是真的吗?

如果是这样,我如何返回const字符串而不是定义const函数?

1 个答案:

答案 0 :(得分:8)

两者完全相同。函数属性可以位于函数的任一侧。 e.g。

pure Bar foo() {...}

Bar foo() pure {...}

是完全相同的。对于purenothrowconst等也是如此。对于大多数属性来说这可能很好,但是当constimmutable时,它变得非常烦人,或涉及inout,因为它们都会影响返回类型。为了使这些属性影响返回类型,必须使用parens。 e.g。

const(Bar) foo() {...}

返回const Bar,而

Bar foo const {...}

const Bar foo() {...}

返回一个mutable Bar,但成员函数本身是const。在大多数情况下,你想要的可能是

Bar foo() {...}

const(Bar) foo() const {...}

因为经常会出现const成员函数迫使你返回const(特别是如果你要返回一个成员变量),但你可以有{{1}的任意组合在成员函数和它的返回类型之间只要它与函数正在做什么一起工作(例如,返回对成员变量的可变引用不能从const函数起作用)。

现在个人而言,我希望将const置于左侧是非法的,特别是当所有函数属性都可以在函数的任何一侧出现的借口时,无论如何都不是真的(例如{{ 3}}),但不幸的是,这就是它在这一点上的方式,我怀疑它会发生变化,因为没有人能够让Walter Bright相信让const继续下去是一个坏主意左边。

但是, 通常被认为是将constconstimmutable放在函数左侧的不良做法,除非他们'使用parens并因此影响返回类型,正是因为如果它们在左边没有parens,你立即不得不质疑执行它的程序员是否意味着修改函数或返回类型。所以,允许它在左边是没有意义的(除了通用代码,但它仍然不值得允许它恕我直言)。