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

C++ 初始化指向结构的指针-编译器警告,c++,c++11,struct,g++,warnings,C++,C++11,Struct,G++,Warnings,我知道在C++11中可以省略赋值运算符,但事实并非如此。 我使用的是g++4.7.2。因为第一个是初始化,第二个是赋值。在C++98中,可以用这种方式初始化简单结构,但不能赋值 8.5.1/1 聚合是一个数组或类(第9条),没有用户声明的构造函数(12.1),没有私有或pro- 受保护的非静态数据成员(第11条),无基类(第10条),无虚拟函数(第10.3条)。 8.5.1/2 初始化聚合时,初始值设定项可以包含由大括号组成的初始值设定项子句- 随附的、以逗号分隔的聚合成员初始值设定项子句列

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

因为第一个是初始化,第二个是赋值。在C++98中,可以用这种方式初始化简单结构,但不能赋值

8.5.1/1

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

8.5.1/2

初始化聚合时,初始值设定项可以包含由大括号组成的初始值设定项子句- 随附的、以逗号分隔的聚合成员初始值设定项子句列表,以递增形式编写 下标或会员订单。


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

错误消息告诉您需要做什么,编译程序时,需要将
-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]
test2.cpp:13:33: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]

正如Andy所说,在临时文件上使用隐式生成的move函数是C++11的一个特性,该临时文件是从
{8,55.2}
创建的,这是第二种情况下的功能。

您的
测试
结构是一个聚合。虽然C++98支持使用大括号语法初始化,但不支持赋值

这里,真正发生的是编译器调用隐式生成的move赋值操作符,该操作符将
测试&&
作为其输入。为了使此调用合法,编译器必须通过构造一个临时变量将
{8,55.2}
转换为
test
的实例,然后从此临时变量移动assign
*secondTest


这种行为仅在C++11中受支持,这就是为什么编译器告诉您必须使用
-std=C++11
选项进行编译。

是的,我知道这一点。但是这两种初始化之间有什么区别呢?如果没有“secondTest”,编译器不会要求我使用-std=c++11标志,我也不明白为什么。@Toshko:区别在于第二个标志不是初始化标志:它是一个assignment@Toshko:很高兴它有帮助:)
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]
 test2.cpp:13:33: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]
                                                                           ^^^^^^^^^     ^^^^^^^^^^^