1

throw-expressionsとcopyコンストラクターについて質問があります。

#include <iostream>

class Foo
{
public:
   Foo() { std::cout << "Foo::Foo() \n"; }
   Foo(const Foo&) { std::cout << "Foo::Foo(const Foo&) \n"; }
   ~Foo() { std::cout << "Foo::~Foo() \n"; }  
};

int main()
{
   try
   {
      throw Foo(); 
   }
   catch (...)
   {
      std::cerr << "Error \n"; 
   }     
}

C ++ 98 / C ++ 03では、このコードは次のように出力されますか?

Foo::Foo()
Error
Foo::Foo(const Foo&)
Foo::~Foo()

C ++ 11では、次のいずれかです。

Foo::Foo()
Error
Foo::Foo(const Foo&)
Foo::~Foo()

また

Foo::Foo()    
Error
Foo::~Foo()

私はこれをC++11でのみ見ました:

12.8クラスオブジェクトのコピーと移動[class.copy]

31 ... — throw-expressionで、オペランドが不揮発性の自動オブジェクト(関数またはcatch-clauseパラメーターを除く)の名前であり、そのスコープが最も内側の囲んでいるtry-blockの終わりを超えない場合(存在する場合)、オペランドから例外オブジェクト(15.1)へのコピー/移動操作は、自動オブジェクトを例外オブジェクトに直接構築することで省略できます。

4

2 に答える 2

2

例外オブジェクトのコピー (または C++11 での移動) は定義されていませんが、コピー可能 (または C++11 での移動) である必要があり、実装はそれを好きなだけコピー (または移動) することができます。ファンシー。

于 2012-09-10T17:14:32.350 に答える
2

私は見ることを期待します:

Foo::Foo()             // construction
Foo::Foo(const Foo&)   // copy to special throw location
Error                  // catch and print error
Foo::~Foo()            // at the end of the catch block the exception object is destroyed.

or

Foo::Foo()             // As above but compiler has optimized the copy out.
Error
Foo::~Foo()

それの訳は:

throw Foo();   // Creates a local temporary object.
               // The throw then copies (moves) the local temporary to an implementation 
               // specific location to preserve it while the stack is unwound.

ただし、注意: コンパイラはオブジェクトのコピーを省略できます (副作用がある場合でも)。したがって、この状況では、コンパイラはコードを最適化して、実装固有の場所に明示的に構築できます。

また、注目に値する:

catch (Foo e)         // Copies the exception object from the implementation specific location
                      // to e so it can be used in the try block. Note this may also result in
                      // object slicing if you don;t catch the exact type.

 catch (Foo const& e) // No copy required as you are using a reference
                      // Thus no chance of slicing.
于 2012-09-10T18:20:47.827 に答える