35

次のようなコードがあります。

#include <boost/optional.hpp>

::boost::optional<int> getitem();

int go(int nr)
{
  boost::optional<int> a = getitem();
  boost::optional<int> b;

  if (nr > 0)
    b = nr;

  if (a != b)
    return 1;

  return 0;
}

Boost 1.53 を使用して GCC 4.7.2 でコンパイルする場合は、次のコマンドを使用します。

g++ -c -O2 -Wall -DNDEBUG

次の警告が発行されます。

13:3: 警告: '<em>((void)& b +4)' は、この関数で初期化されていない状態で使用される可能性があります [-Wmaybe-uninitialized]

どうやら、根本的な問題は GCC にあります。GCC Bugzillaを参照 してください。回避策を知っている人はいますか?

4

4 に答える 4

19

b の構成を次の (実質的に等しい) コードに変更することがわかりました。

auto b = boost::make_optional(false,0);

警告をなくします。ただし、次のコード (これも事実上等しい):

boost::optional<int> b(false,0);

警告を削除しません。まだちょっと物足りない…。

于 2014-02-13T13:09:54.823 に答える