2016-07-13 11 views
8

次のコードについて、標準が何を言っているのだろうかと思います。 stringprintPointerを呼び出す前に一時オブジェクトのデストラクタを実行できますか?関数呼び出し時の暗黙のデストラクタの実行

P.S. VS2010コンパイラはこのコードについて不平を言うことはなく、正しく動作します。

void printPointer(const string* pointer) 
{ 
    cout << *pointer << endl; 
} 

const string* func(const string& s1) 
{ 
    return &s1; 
} 

int main() 
{ 
    printPointer(func("Hello, World!!!")); 
} 
+4

一時的な文字列は、ステートメントの終わりに破壊されます。誰かがおそらくリファレンス(シーケンスポイントを持つもの)を掘り起こすことができますが、あなたはそれを自分で見ることができます:http://ideone.com/N3Brll – CompuChip

答えて

9

string一時オブジェクトのデストラクタは、printPointerを呼び出す前に実行する必要がありますか?

いいえ、一時的なオブジェクトは、それがprintPointer()終了の呼び出しまで存続することを意味しており、それらが作成された点を含むフル表現を評価する際の最後のステップとして破棄されますので。標準#12.2/4 Temporary objects [class.temporary]から

一時オブジェクトは、(字句)は、それらが作成された点を含んでいることをフル式([intro.execution])を評価する際の最後のステップとして、破壊されます。

そして#12.2/6 Temporary objects [class.temporary]

関数呼び出し([expr.call])で基準パラメータにバインドされた一時オブジェクトは、コールを含有する完全発現が完了するまで持続します。

explanatory demo

-6

s1はそれへの参照(つまり、それはfuncに破壊されない)であるようにあなたの文字列は、プログラムが終了するまで破壊されません。 Funcには値渡しまたは値渡しはありません。このコードでは問題ありません。

+4

彼の文字列は 'printPointer'呼び出しの後に破棄されます。それが参照されているからといって、破壊されないというわけではありません。 –

+0

あなたのロジックによって、 'printPointer(func(" Hello、World !!! "));' 'string * s = func(" Hello、World !!! "); printPointer(s); 'も有効である必要がありますか? – CompuChip

関連する問題