C++ C++;默认构造函数的模糊性和其他一些东西。那是什么东西?
我不知道我需要用什么搜索词来找到这个问题的答案,所以如果这是重复的话,很抱歉。基本上,为什么要编译C++ C++;默认构造函数的模糊性和其他一些东西。那是什么东西?,c++,constructor,C++,Constructor,我不知道我需要用什么搜索词来找到这个问题的答案,所以如果这是重复的话,很抱歉。基本上,为什么要编译 struct A {
struct A {
A(){};
A(const char*){};
};
int main() {
//const char* b = "what is going on?";
A(b);
return 0;
}
但事实并非如此
struct A {
A(){};
A(const char*){};
};
int main() {
const char* b = "what is going on?";
A(b);
return 0;
}
test.cpp: In function ‘int main()’:
test.cpp:8: error: conflicting declaration ‘A b’
test.cpp:7: error: ‘b’ has a previous declaration as ‘const char* b’
什么是C++导致了这种模糊?
其主要目的是在类型A的堆栈上创建一个匿名变量。类似于
A(b)代码>,但不命名A.< /P> < P>这是由C++语法中的歧义引起的。代码>A(b)
被解析为b
的定义,即a
类型的对象。有关此问题的详细信息,请参见
要解决这个问题,可以使用统一初始化
A{b}
或用括号括起来,强制它成为表达式而不是声明(a(b))代码>。任何一种修复都将允许您的程序进行编译。C没有引起歧义的功能,因为它不是C代码。您有一个b
声明为const char*
,然后您将另一个b
声明为a
。C++不允许在同一上下文中进行这种变量阴影。谢谢答案,你能详细说明什么是歧义吗?我什么时候希望以这种方式在括号内声明b?为什么它被允许作为b的声明,我以前从未见过使用这种类型的声明。在C++文档中,我可以用什么关键字来找到这种声明类型?@ TeBAT<代码>()>代码>通常用来在复杂的声明中对事物进行分组(例如:代码> int(*x)[n] < /代码>)。但在你的情况下,他们什么也不做。冗长的<>代码>()>代码>可能是为了方便,或者为了保持语法更简单。@ TeBAT在C++标准中查看。@ IZU:这是一个惊人的链接,请您把答案加上。谢谢你的回答!