下面的代码非常愚蠢,根本没有任何意义(我尝试使用move(&&)但结果却出来了。现在,这段代码与移动无关,我的问题不是与移动有关。)
class X
{
public:
X(int num) : m_a(num) { std::cout << "ctor" << std::endl; }
X(const X& other) : m_a(other.m_a) {std::cout << "CCTOR" << std::endl; }
int m_a;
};
int main()
{
int i = 11;
X x1(X(i));
std::cout << &i << " " << x1.m_a << std::endl;
std::cout << typeid(x1).name() << std::endl;
return(0);
}
注释掉第一个印刷品,输出是:
F1XS_E
F代表一个功能。没有注释掉链接错误中的第一个打印结果:
request for member ‘m_a’ in ‘x1’, which is of non-class type ‘X(X)’
此代码应该做的是:使用i作为参数创建临时X,并为x1调用复制构造函数。我很清楚,编译器可以优化它,我的期望不是很有趣lol 无论如何,这不是我的问题。由于我无法解释的原因(这是我的问题),编译器引用了这一行:
X x1(X(i));
作为函数声明:
X x1(X i); // function x1, receives X by value (parameter name: i) and returns X by value
为什么? 如果我将i更改为文字整数(X x1(X(11));) - 它不会抱怨。但是为什么编译器认为i是函数参数,而不是变量? 我知道这是愚蠢的,我可以简单地写X x1(i),我真的不明白为什么当我按照我的方式写它时它会抱怨。或者可能是原因?这是一种愚蠢的写作方式,所以即使编译器认为我们不能那么愚蠢吗?
使用{}(X x1 {X(i)};)
可以正常工作旁注:我刚发现函数参数可以写在括号中,将被忽略。所以void foo(int(((num))));是一个有效的函数声明,它接收参数num,它在int。
中感谢。