4
class Base {};
class Derived : public Base {};

void func(boost::optional<Base>&) {}

int main () {
  boost::optional<Derived> x;
  func(x);
}

func は、基本と派生の両方のオプションを受け入れますか?

4

2 に答える 2

-1

それが機能したとしても(私がチェックしていない可能性が高い)、スライスが発生します。一部のみBaseオプションに格納されます。

optional は、格納に必要なサイズのバッファーを内部的に保持しBaseます。そして、 (あなたの場合のように)Baseと同じサイズであっても、それは.DerivedBase


編集:

上記の回答は、次のコードを含む元の質問に対して与えられました。

int main () {
  boost::optional x(Derived());
  func(x);
}

このようなコードは、次の 2 つの理由から正しくありません。

  1. boost::optionalテンプレート引数が必要です
  2. テンプレート引数があっても、関数宣言のままです。

私はこれらの問題を無視し、次のようなことが意図されていると想定しました。

int main () {
  boost::optional<Base> x = Derived();
  func(x);
}

そのコードはコンパイルされますが (少なくとも Visual Studio 2013 および Boost 1.60)、スライスが発生します。次のプログラムを実行するとわかります。

#include <boost/optional.hpp>
#include <iostream>

class Base
{
public:
    virtual ~Base() { std::cout << "~Base" << std::endl; }
};

class Derived : public Base
{
public:
    virtual ~Derived() { std::cout << "~Derived" << std::endl; }
};

int main()
{
    boost::optional<Base> x = Derived();
}

出力を生成する

〜派生
〜ベース
〜ベース

2番目は、オブジェクトではなくオブジェクトを破壊する~Baseことを示しています。(は、最初の と同様に一時オブジェクトからのものです。)optionalBaseDerived~DerivedDerived()~Base

于 2016-05-18T14:17:09.427 に答える