C++ 初始化指向结构的指针-编译器警告
我知道在C++11中可以省略赋值运算符,但事实并非如此。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 初始化聚合时,初始值设定项可以包含由大括号组成的初始值设定项子句- 随附的、以逗号分隔的聚合成员初始值设定项子句列
我使用的是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]
^^^^^^^^^ ^^^^^^^^^^^