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

Calling constructor with member as argument parsed as variable definition

本文关键字:参数 变量 定义 构造函数 成员 调用      更新时间:2023-10-16

我在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

编译器处理以下行:

File(m_test_val);

File m_test_val;

因此,您实际上是使用默认构造函数创建一个名为 m_test_val 的命名对象。File(fhddfkjdh)也是如此.

解决方案是File(this->m_test_val) - 这会告诉编译器您希望使用该成员来创建创建命名对象。另一种方法是命名对象 - File x(m_test_val)