Const成员函数vs const返回类型

Mer*_*Hul 3 d const

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

struct Person {
    string name;

    // these two are the same?
    const string getConstName() { return name; }     
    string getConstName2() const { return name; }   
}
Run Code Online (Sandbox Code Playgroud)

看来上面两个是相同的含义.这是真的吗?

如果是这样,我怎么能返回一个const字符串而不是定义一个const函数?

Jon*_*vis 8

两者是相同的.函数属性可以位于函数的任一侧.例如

pure Bar foo() {...}
Run Code Online (Sandbox Code Playgroud)

Bar foo() pure {...}
Run Code Online (Sandbox Code Playgroud)

是相同的.这同样适用于pure,nothrow,const,等,这可能是大多数属性很好,但它变得很烦人的时候const,immutable或者inout是参与的,因为它们都可以影响到返回类型.为了使这些属性影响返回类型,必须使用parens.例如

const(Bar) foo() {...}
Run Code Online (Sandbox Code Playgroud)

返回a const Bar,而

Bar foo const {...}
Run Code Online (Sandbox Code Playgroud)

const Bar foo() {...}
Run Code Online (Sandbox Code Playgroud)

返回一个mutable Bar,但成员函数本身就是const.在大多数情况下,你想要的也许是

Bar foo() {...}
Run Code Online (Sandbox Code Playgroud)

要么

const(Bar) foo() const {...}
Run Code Online (Sandbox Code Playgroud)

因为经常出现这样的情况:使用const成员函数会强制你返回const(特别是如果你要返回一个成员变量),但是你可以const在成员函数和它的返回类型之间有任何组合,只要它与函数正在做(例如,返回对成员变量的可变引用不能从const函数中起作用).

现在就个人而言,我希望把const在左边是非法的,特别是当所有的功能属性可以去功能两侧的借口是不是真的反正(例如static,publicprivate似乎不能够走在右边),但不幸的是,这就是现在的样子,我怀疑它会发生变化,因为没有人能够说服Walter Bright放弃const继续下去是一个坏主意左边.

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

  • @ user3733425我之前从未想过这个,但是尝试一下,看起来如果你把`const`放在自由函数的右边,你会得到一个错误,但是如果你把它放在左边,它只是忽略.所以,是的,它总是引用函数而不是类型,但由于某种原因,编译器在它左边而不是给出错误时忽略它. (4认同)