错误的数组初始化与赋值副本构造函数初始化

Bad array initialization vs assignment copy constructor initialization

本文关键字:初始化 副本 构造函数 赋值 数组 错误      更新时间:2023-10-16
#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

有什么结论吗?

我主要回答您的最后一条评论,因为所有元素都已经在评论中给出。

我们能看到什么:

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

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