我在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
答案 0 :(得分:2)
编译器处理行:
File(m_test_val);
作为
File m_test_val;
所以你实际上是使用默认构造函数创建一个名为m_test_val
的命名对象。同样适用于File(fhddfkjdh)
。
解决方案是File(this->m_test_val)
- 这告诉编译器您要使用该成员创建创建命名对象。另一种方法是命名对象 - File x(m_test_val)
。