我编写了以下代码片段,在执行时导致编译错误 codepad.org
int main()
{
int *p = new int(5,6,7);
return 0;
}
我为int的构造函数传递了3个参数,同时为它动态分配内存。(根据我不应该这样做。)
但是当我在visual studio 2010编译器中执行相同的代码时,它正在使用最后一个参数编译和初始化值。为什么这样工作?
答案 0 :(得分:1)
VS2010正在调用commo运算符并正确地指定最后一个值。
http://en.wikipedia.org/wiki/Comma_operator
对于gcc试试这个
int main()
{
int *p = new int((5,6,7));
return 0;
}
答案 1 :(得分:0)
VS2010不符合(惊喜)。 (5,6,7)
中的new int(5,6,7)
是 new-initializer 。根据C ++11§5.3.4/ 15:
创建类型为
T
的对象的 new-expression 按如下方式初始化该对象:
如果省略 new-initializer ,则默认初始化对象(8.5);如果没有执行初始化,则该对象具有不确定的值。
否则, new-initializer 将根据8.5的初始化规则进行解释,以进行直接初始化。
和§8.5/ 13指出:
如果正在初始化的实体没有类类型,带括号的初始值设定项中的表达式列表应为单个表达式。
示例5,6,7
中的表达式列表有多个表达式,因此编译器应将其诊断为错误。