回報考慮一個小單元測試用例取消引用,並通過引用
struct A
{
virtual void func(){}
A& foo()
{
A *obj = reinterpret_cast<A*>(0xdeadbeef);
return *obj; //1
}
};
int main()
{
A obj = obj.foo();
}
在行1
是實現定義/未指定,當我們通過引用返回的尊重是不會發生的,並且程序也不會如果崩潰顯式訪問被指向的對象是不是被做出來的?
我與其中一位同事提出過爭論,他提到在大多數情況下,編譯器會優化obj
的解引用,因爲我們通過引用來返回它,並且此代碼不會崩潰?
感謝
我的理解是:編譯器沒有義務1)運行導致沒有任何事情發生的代碼2)運行產生未定義行爲的代碼:http://blog.llvm.org/2011/05/what-every- c-programmer-should-know_14.html – Patashu 2013-05-09 06:10:26
即使我相信行爲是未定義的,在這種情況下我們不應該依賴底層實現。 – 2013-05-09 06:11:25
這是未定義的行爲,你不應該依賴未定義的行爲做你認爲它會做的事,是的。但是,如果編譯器確定它是死代碼或未定義的,並且不值得爲代碼生成代碼,從學術的角度來講,它也不一定會崩潰。 – Patashu 2013-05-09 06:12:22