當我編譯使用g++
引用類型轉換操作符:請問麻煩?
class A {};
void foo(A&) {}
int main()
{
foo(A());
return 0;
}
我收到以下錯誤消息下面的代碼:
> g++ test.cpp -o test
test.cpp: In function ‘int main()’:
test.cpp:10: error: invalid initialization of non-const reference of type ‘A&’ from a temporary of type ‘A’
test.cpp:6: error: in passing argument 1 of ‘void foo(A&)’
一些反映後,這些錯誤使大量的意義對我來說。 A()
只是一個臨時值,而不是棧上的可分配位置,所以它似乎沒有地址。如果它沒有地址,那我就不能參考它。好的。
但是等等!如果我將以下轉換運算符添加到類A
class A
{
public:
operator A&() { return *this; }
};
那麼一切都很好!我的問題是,這是否是遠程安全的。當A()
被構建爲臨時值時,this
指向什麼?
我給出的事實,
void foo(const A&) {}
可以根據g++
,我已經使用的所有其他編譯器接受臨時值一些信心。 const
關鍵字總是可以丟棄,所以如果在const A&
參數和A&
參數之間存在任何實際的語義差異,我會感到驚訝。所以我想這是另一種方式來問我的問題:爲什麼const
引用編譯器認爲安全的臨時值,而非const
引用不是?
我同意這種事通常是程序員錯誤。如果你好奇,我試圖傳遞的類是一種智能指針,它有一個基礎的堆分配指針成員。實際上,我希望接收函數能夠使用底層指針進行操作。我只想確保臨時智能指針不會被銷燬(遞減引用計數),直到接收函數返回。 – Ben 2009-06-24 21:23:09