微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++ 入门第五题 7.52

如何解决C++ 入门第五题 7.52

锻炼
使用第 2.6.1 节(第 72 页)中的 Sales_data 的第一个版本, 解释下面的初始化。发现并解决任何问题。

我的代码

#include <iostream>
#include <string>
using namespace std;

struct Sales_data
{
    string bookNo;
    unsigned sold_units = 0;
    double revenue = 0.0;
};

int main()
{
    Sales_data item = { "978-1234567",25,15.99 };
    cout << item.bookNo << ' ' << item.sold_units << ' ' << item.revenue << endl;
    system("pause");
}

我首先认为编译器会给我一个错误,因为有类内初始值来防止“Sales_data”成为聚合类。但事实并非如此。

运行代码后,我认为编译器使用初始化列表构造了一个临时对象,将临时对象复制到“item”,最后销毁临时对象。

我的问题是:是不是因为我在 Visual Studio 2017 上编码,编译器没有向我发送错误?上面的代码发生了什么。

解决方法

您的困惑是由于 C++98、C++11 和 C++14 标准之间初始化器和初始化器列表的使用发生了显着变化。

根据 C++98(不允许类内初始化器)或 C++11(不允许使用大括号括起来的初始化器列表),您显示的代码格式错误,但根据C++14(或更高版本)。

Visual Studio 2017 中的 MSVC 编译器默认使用 C++14 标准。如果您想与正在使用的 Primer“更兼容”,您可以明确地将其设置为使用 C++11 标准(IIRC - 该选项已在 VS 2019 中删除)。选择项目的“属性 → C/C++ → 语言 → C++ 语言标准”或添加 /std:c++11 命令行开关。

此外,为了严格(er)遵守所选语言标准,还建议选择“一致性模式”(也在“属性→C/C++→语言”中,或通过{ {1}} 开关)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。