7

g++4.6.3 で奇妙な動作を観察しました。クラスコンストラクターを呼び出すことによって一時的なものを作成するときFile(arg)、コンパイラーはの存在を無視しarg、式を次のように解析することを選択します。File arg;

  • メンバー名が無視されるのはなぜですか?
  • 基準は何と言っていますか?
  • それを避ける方法は?(新しい{}構文を使用せずに)
  • 関連するコンパイラ警告はありますか? (任意の文字列引数を使用できますが、それでも静かに動作します)

コード:

#include <iostream>

class File {
public:
    explicit File(int val) : m_val(val) { std::cout<<"As desired"<< std::endl; }
    File() : m_val(10) { std::cout<< "???"<< std::endl;}

private:
    int m_val;
};

class Test {
public:
    void RunTest1() { File(m_test_val); }
    void RunTest2() { File(this->m_test_val); }
    void RunTest3() { File(fhddfkjdh); std::cout<< "Oops undetected typo"<< std::endl; }
private:
    int m_test_val;
};

int main()
{
    Test t;
    t.RunTest1();
    t.RunTest2();
    t.RunTest3();
    return 0;
}

出力:

$ ???
$ As desired
$ Oops undetected typo
4

1 に答える 1

2

コンパイラは次の行を処理します。

File(m_test_val);

なので

File m_test_val;

したがって、実際にはm_test_val、デフォルトのコンストラクターを使用して呼び出される名前付きオブジェクトを作成しています。についても同様ですFile(fhddfkjdh)

解決策はFile(this->m_test_val)次のとおりです。これは、メンバーを使用して名前付きオブジェクトを作成することをコンパイラーに伝えます。別の方法として、オブジェクトに - という名前を付けますFile x(m_test_val)

于 2012-10-15T10:03:53.843 に答える