【问题标题】:Calling a copy constructor with instance being created在创建实例的情况下调用复制构造函数
【发布时间】:2011-11-23 00:31:49
【问题描述】:

我不是在询问这种调用的逻辑,而是我对支持 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;
}

【问题讨论】:

  • 那么在 GCC 中,先有鸡还是先有蛋?
  • int i = itest t(t) 是完全不同的形式。后者显然是无效的(真的,前者应该也是)。
  • int i = i 是一个赋值,没有复制结构 inoked ..
  • @stijn: int i=i 不是作业。
  • @stijn:这叫做初始化;更准确地说,动态初始化。看到这个:What is dynamic intialization of object in c++?

标签: c++ visual-c++


【解决方案1】:

引用 C++ 标准(3.3.2):

名称的声明点紧接在其完整声明符之后和初始化器

之前

在您的第一条语句中,声明符在 int i 之后结束,因此名称 i 在初始化程序中使用的位置 (= i) 可用,因此该语句格式正确,但其行为不是已定义。

在你的第二个语句中,声明器在test t(t) 之后结束,并且没有初始化器; t 的名称​​不在您使用它的地方可用,因此该语句格式不正确。

所以编译器的行为是正确的。我希望它可以配置为对第一条语句发出警告,但不需要拒绝它;正如你所说,它需要拒绝第二个。

【讨论】:

    【解决方案2】:
     test t(t); -- this line gives an error in Visual C++ 
    

    你在哪里定义了 t?编译器不是物理的!

    【讨论】:

    • 只有 perl 可以忽略物理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多