重新定义其他类型的变量

roo*_*han 8 c++

抱歉,这个问题的标题,但我不知道我的问题的正确标题。我有以下代码示例:

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除外)而使我真正感到困惑。谁能解释这是怎么回事?先感谢您。

Max*_*mer 5

您忘记给test变量命名,导致test(a);声明了一个名为atype 的变量test

在其他情况下,由于test(1)test((int)a)不能是声明,而必须是某种调用,因此编译器会将其视为构造test没有名称的临时对象。


Sch*_*eff 4

这确实很棘手:

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为表达式(但不是标识符)。