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

标签 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。

最佳答案

您的测试 结构是一个聚合。在初始化 aggregate 时C++98 支持大括号语法,不支持赋值。

这里,真正发生的是编译器调用隐式生成的移动赋值运算符,该运算符将 test&& 作为其输入。为了使这个调用合法,编译器必须将 {8, 55.2} 转换为 test 的实例,方法是从它构造一个临时对象,然后移动赋值 *secondTest 来自这个临时的。

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

关于c++ - 初始化指向结构的指针 - 编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15524100/

相关文章:

c++ - 为什么 'std::endl' 在语句 'std::cout << std::endl;"中使用时需要命名空间限定,给定参数相关查找?

c - sendto 中的参数无效

C - 前向声明和使用结构而不是指针

c++ - 如何将大量秒数可移植地添加到 time_t 对象?

c++ - GCC 4.7 从初始化器列表初始化 unique_ptrs 容器失败

c - 如何正确定义结构数组?

java - 如何使用 JNI 从 C++ 向 CallObjectMethod 传递多个参数

c++ - 使用 C++ 成员函数处理采用简单静态函数指针的回调

c++ - 为什么类中的 vector 自动变为 NULL

c++ - 如何静态断言 std::array 类成员在 c++11 中进行排序?