调用构造函数,并将成员作为参数解析为变量定义
Calling constructor with member as argument parsed as variable definition
我在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)
。
相关文章:
- 如何将C++闭包与变量参数同时重用——类似于JavaScript
- 扩展可变参数模板中的变量名称
- 在类构造函数中定义结构变量的参数
- 带有整数的变量参数列表
- 转发变量参数列表以模拟 std::thread
- 如何在不传递命令行参数的情况下在 c++ 中设置环境变量
- 存储稍后要转发的变量参数
- C++具有模板成员变量的类. 和参数内存输出
- 我应该如何在没有变量的情况下将相同的参数传递给 CMAKE 中的多个目标?
- 为变量模板的每个参数调用模板函数
- 具有推导参数的模板函数指针数组变量
- 函数参数变量总是需要 & 或 * 运算符吗?
- 为什么 beginthreadex 线程参数变量在父线程中没有更新
- 在 Metal 着色器代码中,如何定义函数的 in/out 参数变量?
- 如何在函数中使用非参数变量?
- 即将将引用作为函数中的参数传递以更改参数变量的值
- 基于不断变化的参数/变量的XML get值
- cocos2d-x v3 CallFunc作为参数/变量如何
- 在编译时使用c++元编程中的运行时参数(变量)
- 我可以返回一个非参数变量吗?