2

我编写了以下代码片段,在codepad.org上执行时导致编译错误

int main()
{
int *p = new int(5,6,7);
return 0;
}

我在为 int 动态分配内存的同时将 3 个参数传递给 int 的构造函数。(根据我,这不应该工作)。

但是当我在 Visual Studio 2010 编译器中执行相同的代码时,它正在使用最后一个参数编译和初始化值。为什么会这样?

4

2 回答 2

1

VS2010 正在调用 commo 运算符并正确分配最后一个值。

http://en.wikipedia.org/wiki/Comma_o​​perator

对于 gcc 试试这个

int main()
{
 int *p = new int((5,6,7));
 return 0;
}
于 2013-07-21T09:44:43.337 回答
0

VS2010 不合格(惊喜)。(5,6,7)innew int(5,6,7)是一个new -initializer。根据 C++11 §5.3.4/15:

创建类型对象的new表达式T按如下方式初始化该对象:

  • 如果省略new-initializer,则默认初始化对象 (8.5);如果不执行初始化,则对象具有不确定的值。

  • 否则,根据 8.5 的初始化规则解释new-initializer以进行直接初始化。

§8.5/13 规定:

如果被初始化的实体没有类类型,则带括号的初始化器中的表达式列表应为单个表达式。

您示例中的表达式列表5,6,7有多个表达式,因此编译器应将此诊断为错误。

于 2013-07-21T15:29:19.693 回答