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

C++ 调用构造函数,将成员作为参数解析为变量定义,c++,constructor,g++,standards,C++,Constructor,G++,Standards,我在g++4.6.3中观察到了特殊的行为。当通过调用类构造函数File(arg)创建临时函数时,编译器选择忽略arg的存在,并将表达式解析为File arg 为什么会忽略成员名称 标准怎么说 如何避免呢?(不使用新的{}语法) 是否存在相关的编译器警告?(我可以使用任意字符串arg,它仍然可以安静地工作) 代码: 编译器处理以下行: File(m_test_val); 作为 因此,实际上您正在使用默认构造函数创建一个名为m_test_val的命名对象。文件(fhddfkjdh)也是如此 解

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

  • 为什么会忽略成员名称
  • 标准怎么说
  • 如何避免呢?(不使用新的
    {}
    语法)
  • 是否存在相关的编译器警告?(我可以使用任意字符串arg,它仍然可以安静地工作)
代码:


编译器处理以下行:

File(m_test_val);
作为

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


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

只有在创建对象或使用新位置时,才能直接调用构造函数。“fhddfkjdh”是如何工作的?这没有定义,应该会导致编译错误?@PoweRoy,它被视为:
文件fdsfsda()
@Albert不,不是,它被视为
文件fdsfsda
<代码>文件fdsfsda()是一个函数声明。@克里斯,我不想调用它。我想使用接受int作为参数的构造函数创建一个临时对象。另一种解决方案是使用统一的初始化语法:<代码>文件{MyTestVal}} /Case> @ @ Malkse从问题“不使用新{}语法”来解释为什么<代码> MyTestValValue/Cuth>处理与<代码>相同?-> MyTestVala @艾伯特:因为C++语法规则规定当出现歧义时,声明将优先于表达式。@Albert嗯,从技术上讲,没有歧义。:)问题是你处于这个位置是因为你有一个临时职位,什么都不做。。。如果你需要使用它,你一开始就不会在这里:)
$ ???
$ As desired
$ Oops undetected typo
File(m_test_val);
File m_test_val;