初始化指向结构的指针 - 编译器警告

时间:2013-03-20 12:53:22

标签: c++ c++11 struct g++ warnings

#include <iostream>
using namespace std;

struct test
{
   int factorX;
   double coefficient;
};

int main()
{
   test firstTest = {1, 7.5}; //that's ok

   test *secondTest = new test;
   *secondTest = {8, 55.2}; // issue a compiler warning

}

我不明白为什么编译器发出以下警告:

test2.cpp:13:33: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]
test2.cpp:13:33: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]

我知道在C ++ 11中我可以省略赋值运算符,但事实并非如此。 我正在使用g ++ 4.7.2。

3 个答案:

答案 0 :(得分:5)

您的test结构是一个聚合。虽然在C ++ 98中支持使用大括号语法初始化aggregate,但分配不是。

这里,真正发生的是编译器调用隐式生成的移动赋值运算符,它以test&&作为输入。为了使此调用合法,编译器必须通过从中构造临时值将{8, 55.2}转换为test的实例,然后从此临时值移动分配*secondTest

仅在C ++ 11中支持此行为,这就是编译器告诉您必须使用-std=c++11选项进行编译的原因。

答案 1 :(得分:2)

首先是初始化,第二个是赋值。您可以在C ++ 98中以这种方式初始化简单结构,但不能分配。

8.5.1 / 1

聚合是一个数组或类(第9节),没有用户声明的构造函数(12.1),没有私有或pro- 非静态数据成员(第11节),没有基类(第10节),没有虚函数(10.3)。

8.5.1 / 2

初始化聚合时,初始化程序可以包含一个由括号组成的初始化子句 封闭的,以逗号分隔的聚合成员的初始化子句列表,以增加的形式写成 下标或成员顺序。

但是第二个构造调用类的operator =,因为你没有用户定义的副本c-tor,将调用默认的复制c-tor,在C ++ 11中使用{}中的表达式可以是构造所需类型的对象,但不是在C ++ 98中。

答案 2 :(得分:1)

错误消息告诉您需要执行的操作,编译程序时需要在命令行中添加-std=c++11-std=gnu++11。这是一个C ++ 11功能,您必须启用它:

 test2.cpp:13:33: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]
                                                                           ^^^^^^^^^     ^^^^^^^^^^^

正如Andy所说,在{8, 55.2}创建的临时使用隐式生成的移动函数是一个C ++ 11特性,这是你在第二种情况下所拥有的。