struct x
{
int a;
int b;
};
void fun( struct x* a )
{
}
int main( void )
{
fun( &((struct x){1,2}) ); //報錯
return 0;
}
uj5u.com熱心網友回復:
既然是臨時變數,意味著轉瞬即逝,你這么取?除非用const & *,右值參考 系結他。
另外c++ 不用struct x 宣告,直接 x就可以
uj5u.com熱心網友回復:
變數的作用域和生存期了解一下。uj5u.com熱心網友回復:
C語言可以取,變數至少都是函式級生存期
uj5u.com熱心網友回復:
C語言里沒問題,而且正常使用
uj5u.com熱心網友回復:
添加一個建構式
struct x
{
int a, b;
x(int _a, int _b){ a=_a; b=_b;}
};
void fun( struct x* a ){}
int test( void )
{
fun( & struct x(1,2) );
return 0;
}
uj5u.com熱心網友回復:
c是c,c++是c++。
添加一個建構式
struct x
{
int a, b;
x(int _a, int _b){ a=_a; b=_b;}
};
void fun( struct x* a ){}
int test( void )
{
fun( & struct x(1,2) );
return 0;
}
一樣的,gcc 報錯。。。。
uj5u.com熱心網友回復:
c是c,c++是c++。
我主要就是想確認,不能取臨時變數地址是C++的規則不允許,還是我C++的版本原因,還是什么其他原因?
至于我之前說的,我的意思是,既然C和C++相似,C的變數至少都是函式級生存期,所以我覺得C++的這一點應該是和C是一樣的。
剛剛我去查了下cppreference,關于臨時物件的生存期,有這樣一段話:任何臨時物件的銷毀,都是作為(詞法上)包含創建它的位置的全運算式的求值程序的最后一步進行的
也就是說,當fun函式呼叫結束前,這個臨時物件都是存在的,那么在fun函式內使用它都是沒問題的,所以應該不是生存期的原因吧?
uj5u.com熱心網友回復:
相似不是相同,考慮問題要全面。
uj5u.com熱心網友回復:
如果你說的是正確的,那么代碼是這樣呢?struct x
{
int a;
int b;
};
x* fun( struct x* a )
{
return a;
}
int main( void )
{
x* x1=fun( &((struct x){1,2}) ); //報錯
//這時候x1還存在嗎?
return 0;
}
c是c,c++是c++。
我主要就是想確認,不能取臨時變數地址是C++的規則不允許,還是我C++的版本原因,還是什么其他原因?
至于我之前說的,我的意思是,既然C和C++相似,C的變數至少都是函式級生存期,所以我覺得C++的這一點應該是和C是一樣的。
剛剛我去查了下cppreference,關于臨時物件的生存期,有這樣一段話:任何臨時物件的銷毀,都是作為(詞法上)包含創建它的位置的全運算式的求值程序的最后一步進行的
也就是說,當fun函式呼叫結束前,這個臨時物件都是存在的,那么在fun函式內使用它都是沒問題的,所以應該不是生存期的原因吧?
uj5u.com熱心網友回復:
如果你說的是正確的,那么代碼是這樣呢?
struct x
{
int a;
int b;
};
x* fun( struct x* a )
{
return a;
}
int main( void )
{
x* x1=fun( &((struct x){1,2}) ); //報錯
//這時候x1還存在嗎?
return 0;
}
你這個x1又不是臨時變數。。。
uj5u.com熱心網友回復:
如果你說的是正確的,那么代碼是這樣呢?
struct x
{
int a;
int b;
};
x* fun( struct x* a )
{
return a;
}
int main( void )
{
x* x1=fun( &((struct x){1,2}) ); //報錯
//這時候x1還存在嗎?
return 0;
}
你想說的是fun的回傳值這個臨時變數吧?我查的結果是在回傳運算式結束立即銷毀,如果你檢測到資料沒有變化,可能是解除了系結但資料還沒被覆寫,也可能是編譯器的編譯方式實際讓它的更晚被銷毀吧
uj5u.com熱心網友回復:
如果你說的是正確的,那么代碼是這樣呢?
struct x
{
int a;
int b;
};
x* fun( struct x* a )
{
return a;
}
int main( void )
{
x* x1=fun( &((struct x){1,2}) ); //報錯
//這時候x1還存在嗎?
return 0;
}
你想說的是fun的回傳值這個臨時變數吧?我查的結果是在回傳運算式結束立即銷毀,如果你檢測到資料沒有變化,可能是解除了系結但資料還沒被覆寫,也可能是編譯器的編譯方式實際讓它的更晚被銷毀吧
指向堆里面的東西,可不是回傳就銷毀啊!
把fun改一下
x* fun( struct x* a )
{
return new x;
}
編譯器怎么檢測?而且fun完全是可以另外一個dll匯出函式,已經被編譯完畢,你什么時候檢測????
uj5u.com熱心網友回復:
如果C++允許取臨時變數的地址,將面臨兩難的問題,他的生存期無法確定,你是讓他自動管理呢?還是由程式員管理?所以c++不允許取臨時變數的地址。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/159469.html
標籤:C++ 語言
下一篇:Servlet 簡介
