错误数组初始化与赋值复制构造函数初始化

时间:2015-01-07 11:36:39

标签: c++ copy-constructor

#include<iostream>
using namespace std;

class Test
{
public:
    Test(){}
    Test(int param):i(param){}
    int i;
};

int main()
{

    Test obj1(100);
    //Test obj2[100](obj1) ;  - This doesn't work I know
    Test obj3[10] = obj1; //This works
    cout<<obj3[9].i<<endl;
    return 1;
}

在上面的代码中,Test obj2[100](obj1);无效,Test obj3[10] = obj1;

为什么前者支持但后者支持。(两者都将调用复制构造函数。)

由于编译器中的实现限制,是不是支持前者?

编辑:我没有使用c ++ 11。 gcc版本4.8.2(i686-posix-dwarf-rev3,由MinGW-W64项目构建) Qt 5.3.1

有任何结论吗?

1 个答案:

答案 0 :(得分:1)

我主要回答你的上一条评论,因为所有元素都已在评论中提供。

我们能看到什么:

  • 第一个语法Test obj2[100](obj1);被所有被测试的编译器拒绝为错误,因为......它不遵循C ++语言的规范!
  • 第二种语法Test obj2[100] = obj1;似乎并不完全符合当前规范,因为您使用单个元素初始化数组。更多内容:
    • clang(和MSVC)会发生冲突:它们需要花括号,然后只初始化第一个元素(将是:Test obj2[100] = {obj1};
    • gcc(4.5到4.9)接受它并使用obj1
    • 的副本初始化数组的所有元素

我的观点是,由于不清楚它是正确的C ++,并且因为它会导致一些使用频繁的C ++编译器出错,所以你应该避免使用第二种语法,除非用红色闪烁字体记录它。