6

これまで C++ でこれに遭遇したことはありませんが、それでもコンパイルできるのに期待どおりに動作しないのは奇妙です。誰かがそれが何をするのか教えてもらえますか? コードを参照してください。詳細は次のとおりです。

#include <iostream>
using namespace std;

class Test{
    public:
        Test();
};

Test::Test(){ cout << "ctor" << endl; }

int main(void){

    Test t();  // this compiles but doesn't call the constructor

    return(0);
}

コンパイルされますが、「t」を使用しようとするとコンパイルされません。コンストラクターの機能のみに依存していたため、コードが期待どおりに機能しませんでした。解決策は、括弧「Test t();」をなくすことです。「テストt;」に。私の質問は、「Test t();」で何が起こっているかです。例、そしてコンパイラーがコンパイルできるようにするために何が起こっているとコンパイラーは考えていますか。

4

2 に答える 2

5

これは最も厄介なパースです。基本的に、C++ の構文解析規則によれば、そこにあるのはTestという名前の型のオブジェクトではなく、引数を 0 取り、 を返すt関数の関数宣言です。tTest

ちなみに、clang++ は実際にこの状況を認識し、警告を発して、これはおそらく意図したとおりに動作していないことを伝えます。

于 2012-12-18T02:40:59.967 に答える
1

これは、最も厄介な解析として適切に名付けられた一般的な問題です。あなたの行Test t();は2つの方法のいずれかで解釈することができます。

  1. tタイプの変数を宣言できますTest
  2. t()値を返し、Test引数を取らない関数を宣言できます

残念ながら、C ++標準では、コンパイラが2番目の選択肢を検討する必要があります。これは非常に厄介な解析です。

その解析を修正する最も簡単な方法は、括弧を取り除き、変数をそのように宣言することです。

Test t; // Will call the default constructor
于 2012-12-18T02:49:49.933 に答える