C++ 编译器将变量声明与函数原型混淆

C++ 编译器将变量声明与函数原型混淆,c++,language-lawyer,variable-declaration,ambiguity,function-prototypes,C++,Language Lawyer,Variable Declaration,Ambiguity,Function Prototypes,考虑以下代码 struct A { A() { /* do something */ } }; struct B { B(const A& a) { /* do something*/ } }; int main() { B b(A()); // the rest of the code } 因此,我打算将b定义为从a的临时实例构造的变量。但是,编译器将此行理解为函数原型声明: warning C4930: 'B b(A (__cdecl *)(vo

考虑以下代码

struct A {
    A() { /* do something */ }
};

struct B {
    B(const A& a) { /* do something*/ }
};

int main() {
    B b(A());
    // the rest of the code
}
因此,我打算将
b
定义为从
a
的临时实例构造的变量。但是,编译器将此行理解为函数原型声明:

warning C4930: 'B b(A (__cdecl *)(void))': prototyped function not called (was a variable definition intended?)
有人能解释一下发生了什么事,以及我打算怎么做吗?这是标准针对函数原型而不是变量定义解决的已知歧义吗


我知道
B=A()有效,但我不喜欢它的外观。它没有显示意图。

伙计们,这个问题只问为什么
A(())不能是一个解决方法,答案建议
a{}。所以它不是复制品。在这里,我想解释一下为什么会发生这种情况。我很困惑:你说这意味着
A{}bb{A()}“我要求解释为什么会发生这种情况”-之所以会发生,是因为标准规定,任何可以解释为函数原型的东西都是函数原型。使用统一初始化
bb{A()}
意味着它不可能是一个函数原型,所以您可以得到您想要的。在这种情况下,编译器不会混淆;你的代码是。故事结束。现在,知道这个名字是“最令人烦恼的解析”,我能够在Re找到我的答案:“这是一些已知的歧义吗”——是的,没错。语言语法是不明确的,消除歧义的规则是,如果一个声明看起来既像对象的定义又像函数的声明,那么它将被视为函数的声明。