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