【发布时间】:2019-05-17 07:52:57
【问题描述】:
我可以这样做:
#include <iostream>
int counter;
int main()
{
struct Boo
{
Boo(int num)
{
++counter;
if (rand() % num < 7) Boo(8);
}
};
Boo(8);
return 0;
}
这会编译得很好,我的计数器结果是 21。但是,当我尝试创建传递构造函数参数而不是整数文字的 Boo 对象时,出现编译错误:
#include <iostream>
int counter;
int main()
{
struct Boo
{
Boo(int num)
{
++counter;
if (rand() % num < 7) Boo(num); // No default constructor
// exists for Boo
}
};
Boo(8);
return 0;
}
如何在第二个示例中调用默认构造函数,但在第一个示例中没有调用?这是我在 Visual Studio 2017 上遇到的错误。
在在线 C++ 编译器 onlineGDB 上出现错误:
error: no matching function for call to ‘main()::Boo::Boo()’
if (rand() % num < 7) Boo(num);
^
note: candidate expects 1 argument, 0 provided
【问题讨论】:
-
@NeilButterworth 我知道最令人烦恼的解析,但它并没有让我感到震惊,因为我将局部变量传递给构造函数,并认为这并不模棱两可,因为传递局部变量标识符时,我没有看到它模棱两可。 user10605163 的回答很有启发性,因为它解释了类型或非类型不用于消歧。除了我对这两个答案都投了赞成票之外,我对赞成票一无所知,因为我发现它们很有帮助。如果这是欺骗,你可以关闭它。
-
@NeilButterworth:“这些提议有什么问题吗?” 因为最棘手的解析通常表现为创建临时函数和声明函数之间的竞争。这被视为创建变量。相似的想法,相似的分辨率,但最终来源不同。
-
@Nicol “这些建议有什么问题吗?” - 嗯什么?在哪里?
-
我对问题和答案投了赞成票,因为我学到了一些新东西。我知道最令人烦恼的解析,它的这种表现形式与我以前见过的表现形式截然不同。答案很有帮助,解决方法也很有趣。
-
@user202729:但他们不是。简单地说“最令人烦恼的解析”并不能回答这个问题。您必须解释 如何 这是一个“最令人头疼的解析”。这需要解释它在这种情况下试图声明一个变量,但在其他情况下是一个函数。这些是不同的事情,出于不同的原因,因此必须有不同的答案。
标签: c++ constructor scope default-constructor most-vexing-parse