调用构造函数,将成员作为参数解析为变量定义

时间:2012-10-15 10:02:27

标签: c++ constructor g++ standards

我在g ++ 4.6.3中观察到了奇怪的行为。通过调用类构造函数File(arg)创建临时文件时,编译器选择忽略arg的存在并将表达式解析为File arg;

  • 为什么忽略会员名称?
  • 标准说什么?
  • 如何避免它? (不使用新的{}语法)
  • 是否有相关的编译器警告? (我可以使用任意字符串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

1 个答案:

答案 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)