我编写了以下代码片段,在codepad.org上执行时导致编译错误
int main()
{
int *p = new int(5,6,7);
return 0;
}
我在为 int 动态分配内存的同时将 3 个参数传递给 int 的构造函数。(根据我,这不应该工作)。
但是当我在 Visual Studio 2010 编译器中执行相同的代码时,它正在使用最后一个参数编译和初始化值。为什么会这样?
我编写了以下代码片段,在codepad.org上执行时导致编译错误
int main()
{
int *p = new int(5,6,7);
return 0;
}
我在为 int 动态分配内存的同时将 3 个参数传递给 int 的构造函数。(根据我,这不应该工作)。
但是当我在 Visual Studio 2010 编译器中执行相同的代码时,它正在使用最后一个参数编译和初始化值。为什么会这样?
VS2010 正在调用 commo 运算符并正确分配最后一个值。
http://en.wikipedia.org/wiki/Comma_operator
对于 gcc 试试这个
int main()
{
int *p = new int((5,6,7));
return 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
有多个表达式,因此编译器应将此诊断为错误。