#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。
答案 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特性,这是你在第二种情况下所拥有的。