错误的数组初始化与赋值复制构造函数初始化
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++ 编译器上导致错误,因此您应该避免使用第二种语法,除非以红色闪烁字体记录。
#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
的副本初始化数组的所有元素
- clang(和 MSVC)会与之发生冲突:它们需要花括号然后只初始化第一个元素(将是:
我的观点是,由于不清楚它是否是正确的 C++,并且它会在一些频繁使用的 C++ 编译器上导致错误,因此您应该避免使用第二种语法,除非以红色闪烁字体记录。