Questions tagged «most-vexing-parse»

2
为什么在声明变量时,C ++允许我们在括号内将变量名括起来?
例如这样的声明: int (x) = 0; 甚至: int (((x))) = 0; 我偶然发现了这一点,因为在我的代码中我碰巧有一个类似于以下内容的片段: struct B { }; struct C { C (B *) {} void f () {}; }; int main() { B *y; C (y); } 显然,我想构造一个对象C,然后在其析构函数中做一些有用的事情。但是,在这种情况下,编译器将其C (y);视为y具有类型的变量声明,C因此它会显示有关y重新定义的错误。有趣的是,如果我以它C (y).f ()或类似的C (static_cast<B*> (y))方式编写它,它将按预期进行编译。当然,最好的现代解决方法是{}在构造函数调用中使用。 因此,正如我在此之后发现的那样,可以像这样int (x) = 0;或什至声明变量,int (((x))) = 0;但是我从未见过有人实际使用过这样的声明。因此,我很感兴趣-这种可能性的目的是什么,因为到目前为止,我看到它只会创建类似于臭名昭著的“最令人烦恼的分析”的案例,并且没有添加任何有用的信息?

3
我不明白为什么编译
我当然会缺少一些东西,但是我不明白为什么会这样编译(同时使用g ++和clang ++): struct A { }; struct B { }; int main() { A a(B); } 首先,B是一个类型……不是一个值。我应该如何解释此代码?

3
为什么这称为默认构造函数?
struct X { X() { std::cout << "X()\n"; } X(int) { std::cout << "X(int)\n"; } }; const int answer = 42; int main() { X(answer); } 我本来希望可以打印 X(int),因为X(answer);可以解释为从int到X或 什么也没有,因为X(answer);可以解释为变量的声明。 但是,它打印出来X(),我不知道为什么X(answer);要调用默认构造函数。 优点:要获得临时声明而不是变量声明,我需要更改什么?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.