0

私たちのプロジェクトで次の問題を抽出しました。次のコードは、g++ で正常にコンパイルされます

#include <vector>

class A {};

typedef std::vector<A*> vec_t;

class bar {
public:
  bar(vec_t) {};
};

class foo
{
public:
  foo(bar* a = new bar(vec_t())) {};
};

class B
{};

int main()
{
  return 0;
}

ただし、Visual Studio Compiler (VC12、しかし他のすべてのコンパイラも想定) は、fooの c'torのデフォルト引数で、ベクトルのインスタンスを引数として取るbarの c'tor が呼び出されることを理解していません。 . これにより、この式の後に宣言されたすべてのクラス/構造体でエラーが発生します。

error C2462: 'B' : cannot define a type in a 'new-expression'

c'tor のソフトウェア設計については議論したくありませんが、これはコンパイラの問題ですか、それとも標準の C++ では許可されておらず、g++ はそれについて厳密ではありませんか?

まず、デフォルト パラメーターのテンプレートのインスタンス化が許可されていないか、デフォルトの引数で c'tor がネストされている可能性があると考えました。ただし、ベクターの別の c'tor を使用すると、次のようになります。

foo(bar* a = new bar(vec_t(0))) {}

MSVC でコンパイルされます。上位バージョンがコンパイルされない理由がわかりませんか? それについて何か考えはありますか?

4

1 に答える 1

0

これは「最も厄介な解析」の問題のようです (詳細については、ウィキペディアの記事を参照してください)。新しい式のあいまいさを解消する 1 つの方法は、次のようにコンストラクターの周りに括弧を追加することです

foo(bar* a = new bar((vec_t()))) {};

標準への準拠に関しては、よくわかりません。N3690のセクション 6.8 (あいまいさの解決) と 5.3.4 (新規) をざっと読みましたが、あまり深く考えずに、どちらの方法でも目立ったものは何もありませんでした。おそらく、本物の言語弁護士が介入して答えを出す必要があるでしょう.

于 2013-11-15T00:43:27.963 に答える