【问题标题】:C++ primer 5th exercise 7.52C++ 入门第 5 练习 7.52
【发布时间】:2021-09-21 11:55:21
【问题描述】:

锻炼
使用第 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++ visual-studio c++11 visual-studio-2017


    【解决方案1】:

    您的困惑是由于初始化程序和初始化程序列表的使用在 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 命令行开关。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2021-08-25
      • 2021-11-24
      相关资源
      最近更新 更多