构造对象的歧义

Ambiguity with constructing objects

本文关键字:歧义 对象      更新时间:2023-10-16

下面是我写的一个例子:

struct Foo
{
Foo() = default;
Foo(int)
{
};
};
int main()
{
int baz = 10;
Foo(1); // OK
Foo(baz); // Fails, redefinition 
return 0;
}

为什么Foo(baz)尝试构造一个新对象baz,而不是构造一个将参数baz传递给构造函数的匿名对象?当我通过编写Foo(bar)来声明对象bar时,我会得到一个默认的初始化对象,但一旦我尝试传递一个参数,它就会失败。如何解决歧义?

Foo(baz);相当于Foo baz;,它显然是一个声明。

由于baz早些时候已经在相同的作用域中声明为int类型的局部变量,因此会出现重新定义错误。