【问题标题】:Why cannot i initialize struct like this?为什么我不能像这样初始化结构?
【发布时间】:2016-04-21 02:00:24
【问题描述】:
struct Employee
{
    int age;
    double wage;
};

Employee joe;
joe = {2,60.0}; //using initialization list instead of doing Employee joe={2,60.0}

我在 Visual Studio 2015 中遇到编译错误,但能够在使用 C++ 版本 C++11 的代码块中执行

【问题讨论】:

  • 因为这是一个赋值,而不是一个初始化?赋值和初始化是两个完全不同的东西,尽管它们都与令牌 = 相关联。
  • 这应该可以工作(并且在webcompiler.cloudapp.net上工作);如果不是,那就是编译器错误。
  • 这绝对可以。我刚刚在VS2015上测试过,还不错。你确定这是你得到的错误吗?尝试仅使用该结构的新项目,然后在 main 中使用第二部分,仅此而已。
  • 检查您使用的是 v140 平台工具集
  • 我在 Visual Studio 2012 中运行此代码时观察到: struct Employee { int age;双倍工资; }; int main() { 员工乔 {2,56.0};乔 = {1,34.0};存在编译错误,它不允许我在 Employee joe{ 行以及下一行 joe = {. 中放置大括号

标签: c++ c++11


【解决方案1】:

它应该工作。

复制列表初始化

以下是有效的,称为copy-list-initialization

joe = {2,60.0};

它实际上是正在初始化的右侧的临时变量。看看this answer

正如所提供示例的 cmets 中所述,以下将是初始化。更具体地说,它copy-list-initialization。 (在 c++11 之前它曾经是copy initialization,但现在大括号从 c++11 开始就被接受了):

Employee joe={2,60.0}

复制作业

或者你可以使用copy assignment:

joe = Employee{2,60.0};

聚合初始化

定义变量时可以使用aggregate initialization

Employee joe{2,60.0};

【讨论】:

  • "但是这试图将 std::initializer_list 分配给 joe" 这完全是错误的。
  • @T.C.它还应该在这里处理聚合初始化吗?我试过了,但找不到关于它的报价......
  • @song 应该聚合初始化一个临时文件,然后从中移动分配。
  • @Barry 知道了!谢谢。
  • Employee joe={2,60.0} 也是复制列表初始化
【解决方案2】:

在 C++ 中正确初始化 struct 的常用方法是通过适当的构造函数,如下所示:

struct Employee
{
    int age;
    double wage;

    Employee(int _age, double _wage): age(_age),wage(_wage) {}
};

然后,将其用作:

Employee joe(2, 60.0); // declaration and initialization.

【讨论】:

    猜你喜欢
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 2023-04-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多