为什么编译器将非函数声明称为一个? C ++

时间:2017-02-08 16:21:26

标签: c++

下面的代码非常愚蠢,根本没有任何意义(我尝试使用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。

感谢。

0 个答案:

没有答案