抱歉,这个问题的标题,但我不知道我的问题的正确标题。我有以下代码示例:
struct test {
test(int a) {
}
};
int main() {
test(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的示例代码有效。现在,我(以我的理解)做了一点不同:
struct test {
test(int a) {
}
};
int main() {
int a = 0;
test(a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译此文件时,出现以下错误:
error: redefinition of 'a' with a different type: 'test' vs 'int'
Run Code Online (Sandbox Code Playgroud)
但是我认为当我尝试这样做时,它真的很奇怪:
struct test {
test(int a) {
}
};
int main() {
int a = 0;
test((int)a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的示例再次起作用,并且因为我看不到区别(将int转换为int除外)而使我真正感到困惑。谁能解释这是怎么回事?先感谢您。
您忘记给test变量命名,导致test(a);声明了一个名为atype 的变量test。
在其他情况下,由于test(1)和test((int)a)不能是声明,而必须是某种调用,因此编译器会将其视为构造test没有名称的临时对象。
这确实很棘手:
test(1);
Run Code Online (Sandbox Code Playgroud)
test这是论证 1的构造。
int a = 1;
test(a);
Run Code Online (Sandbox Code Playgroud)
编译器将其读作(命名test a;实例- 使用默认构造)。此时编译器甚至不考虑提供默认构造函数。testatest
修复(由OP发现):
int a = 1;
test((int)a);
Run Code Online (Sandbox Code Playgroud)
现在,编译器被明确告知读取a为表达式(但不是标识符)。