一個表達式調用一個按值返回的函數是一個prvalue。但是,也有非類非陣列類型(§5/ 6)的無const
prvalues:
如果prvalue最初具有類型爲「CV T
」,其中T
是CV-不合格非類,非數組類型,在進行任何進一步分析之前,表達式的類型被調整爲T
。
這意味着你的兩個函數定義沒有區別。是否返回const int
或僅僅是int
是無關緊要的,因爲表達式從不是const
。
但是,當您返回類類型時有區別。請看下面的例子:
struct foo
{
void bar() { std::cout << "Hello" << std::endl; }
};
foo get_foo();
現在,如果我們調用get_foo()
,我們得到了一個臨時foo
對象。這個prvalue不是const
,我們可以調用非const
成員函數,所以我們可以愉快地做get_foo().bar()
。但是,我們可以這樣修改申報get_foo
:
const foo get_foo();
現在,表達get_foo()
是const
prvalue(這是允許的,因爲它是一個類類型),我們不能返回的臨時對象調用bar
它再一次。
儘管如此,討論非類類型的移動語義沒有意義,因爲int
永遠不會移出。如果您返回const
類別類別,則該類型也可能因爲const
而無法移出。爲了證明:
foo get_foo();
foo f(get_foo()); // Will call the move constructor
const foo get_foo();
foo f(get_foo()); // Will call the copy constructor
這是因爲const
prvalue不會綁定到非const
右值引用,這是移動的構造函數作爲其參數。
沒有區別導致'int'是原始類型 –
@ Cheersandhth.-Alf:Spot on! :) –
可能的重複[應使用返回類型的無用類型限定符,爲清晰起見?](http://stackoverflow.com/questions/1579435/should-useless-type-qualifiers-on-return-types-be-用於清晰) –