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

InQ*_*ive 5 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;
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码Test obj2[100](obj1);不起作用Test obj3[10] = obj1;

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

是不是因为编译器中的实现限制而不支持前者?

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

有什么结论?

Ser*_*sta 1

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

我们能看到什么:

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

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