2014-06-16 95 views
3

在d我可以在C++指定const函数,如:const成员函数VS const的返回类型

struct Person { 
    string name; 

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

看来,上述两个是相同的含义。这是真的吗?

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

+0

[在D中为[const和non-const结构提供@property]的可能重复(http://stackoverflow.com/questions/24160745/provide-property-for-const-and-non-const-structures-in -d) – burner

回答

8

两者是相同的。函数属性可以放在函数的任何一边。例如

pure Bar foo() {...} 

Bar foo() pure {...} 

是相同的。 pure,nothrow,const等也是如此。这对于大多数属性来说可能是很好的,但是当涉及const,immutableinout时,它会变得非常烦人,因为它们都会影响返回类型。为了使这些属性影响返回类型,必须使用parens。例如

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

返回const Bar,而

Bar foo const {...} 

const Bar foo() {...} 

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

Bar foo() {...} 

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

,因为它经常使具有const成员函数迫使你返回const(特别是如果你返回一个成员变量的情况下),但只要它与函数的作用一致,就可以在成员函数和它的返回类型之间使用const的任意组合(例如,返回一个可变引用成员变量不起作用const函数)。

现在我个人希望将const放在左侧是非法的,尤其是当所有功能属性都可以放在函数的任何一边的借口不是真的(例如static, public, and private don't seem to be able to go on the right-hand side),但不幸的是这就是目前的情况,我怀疑它会发生变化,因为没有人能说服沃尔特布莱特让const走在左边是个坏主意。

然而,通常被认为是不好的做法constimmutable,或inout在功能上的左侧,除非他们使用括号,从而影响返回类型,正是因为如果他们把在没有parens的左边,你必须立即质疑程序员是否意味着修改函数或返回类型。所以,让它在左边是非常没有意义的(旁边可能是泛型代码,但它仍然不值得让它恕我直言)。

+1

谢谢。这确实是非常不直观的.. –

+1

还有一件事。关于函数的'const'(不是成员方法)呢?函数在方法的意义上不能是'const',所以'const'总是指向函数中的返回类型? –

+4

@ user3733425我以前从来没想过这件事,但试过它,看起来好像你把'const'放在一个自由函数的右边,你会得到一个错误,但是如果你把它放在左边,它就是只是忽略了。所以,是的,它总是指的是函数而不是类型,但由于某种原因,编译器会在左边而不是提供错误时忽略它。 –