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

Bad array initialization vs assignment copy constructor initialization

#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++ 编译器上导致错误,因此您应该避免使用第二种语法,除非以红色闪烁字体记录。