错误的数组初始化与赋值副本构造函数初始化
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
的副本初始化数组的所有元素
- clang(和MSVC)会冲突:它们需要大括号,然后只初始化第一个元素(将是:
我的观点是,由于不清楚它是否正确C++并且由于它会导致一些频繁使用的C++编译器出错,因此您应该避免使用第二种语法,除非以红色闪烁字体记录它。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- 副本初始化的默认模板参数推导
- 为什么 std::string s = "123" 当不涉及副本时被视为复制初始化?
- C 标准:通过复制返回以初始化无RVO的参考:是否有任何副本
- 为什么我的类的副本初始化不适用于使用字符串文字的string_view?
- C 中副本初始化要求的放松17
- 是否可以编写便于副本初始化的显式构造函数
- 为什么初始化列表会导致2个数据副本,而不仅仅是单个副本将其传递给函数
- 构造函数初始化列表中的 C 结构副本C++
- 初始化引用时何时以及为何获得副本
- 错误的数组初始化与赋值副本构造函数初始化
- C++-初始化由不同线程拥有的对象的两个副本
- 在使用auto时初始化结构会导致VS 2013中的副本
- 从计数和元素值初始化 std::vector 与副本
- 带有单个副本的初始化std::字符串
- 在显式初始化期间尝试创建函数副本时出错
- 用函数返回值初始化std::string,是否有副本
- 通过值传递的CRTP模式的未初始化副本
- 用ref. parameter初始化ref. field:是一个副本
- 为什么在初始化列表中不需要创建额外的副本就可以对数据进行赋值