2014-06-16 97 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'放在一個自由函數的右邊,你會得到一個錯誤,但是如果你把它放在左邊,它就是隻是忽略了。所以,是的,它總是指的是函數而不是類型,但由於某種原因,編譯器會在左邊而不是提供錯誤時忽略它。 –