我不是在问这样一个调用的逻辑,而是我对支持b / w Visual C ++和GCC / Clang的不同感兴趣。 Visual C ++不允许将对象的新实例用作其自己的复制构造函数的参数。 GCC和Clang允许这样做。考虑到'int i = i;'允许,我想知道Visual C ++是否有错误。
class test {
private:
test() {}
public:
test(const test& t) {}
};
int main(void) {
int i = i;
test t(t); -- this line gives an error in Visual C++
return 0;
}
答案 0 :(得分:2)
引用C ++标准(3.3.2):
名称的声明位于其完整声明符之后及其初始值设定项之前
在您的第一个语句中,声明符在int i
之后结束,因此名称i
在初始值设定项(= i
)中使用时可用,因此声明格式正确,但其行为未定义。
在你的第二个陈述中,声明者在test t(t)
之后结束,并且没有初始化器;在您使用它的地方,名称t
不,因此声明格式不正确。
因此编译器的行为正确。我希望它可以配置为对第一个语句发出警告,但不要求拒绝它;正如你所说的,它需要拒绝第二个。
答案 1 :(得分:0)
test t(t); -- this line gives an error in Visual C++
你在哪里定义了?编译器不是物理的!