【问题标题】:assignment to type and empty braces. clarification on syntax [duplicate]赋值给类型和空大括号。语法说明[重复]
【发布时间】:2020-01-20 19:09:53
【问题描述】:

我只是遇到了一些代码,我相信我从未见过下面显示的语法。

struct A {
  int m_int;
  A (int a = int {}) : m_int(a) {}
};

所以很明显构造函数接受一个整数,按值,即int a,后跟赋值运算符和类型int,空括号和右括号关闭。我无法破译后半部分(int {})。 int a = int {} 是什么意思?请指导我了解更多信息。我该如何解决?

谢谢你, 高拉夫

【问题讨论】:

  • 示例中没有赋值运算符。
  • 一个临时值在此处初始化为 0,然后将该值复制到参数中。
  • int a = int {} 中的第二个 int 是多余的。 int a = {} 做同样的事情。
  • 感谢@Maestro。这样做对我们有什么好处。这对我们有什么特别的帮助吗?

标签: c++ syntax constructor


【解决方案1】:

在您的构造函数中,您定义了一个接受整数和默认构造函数的构造函数。请记住,为其所有参数提供默认参数的构造函数也定义了默认构造函数。

  • 你可以这样写:

    A (int a = 0); // a 是默认参数。

在你的例子中:

A (int a = int {});//

参数a是一个默认参数,从一个临时整数初始化(未赋值),它是值初始化的,所以因为它是整数,所以它被值初始化为0,然后用于初始化参数a。 (a 是它的副本)。编译器在很多场景下优化代码去除副本。

A (int a = int {5.6});// error
A (int a = int(5.6));// truncated to 5

【讨论】:

  • 是的。现在我更好地理解它了。这很有帮助。再次感谢。
  • 不客气。
【解决方案2】:

后跟赋值运算符

没有。这不是赋值操作。这是默认参数的语法。这意味着您可以在不显式传递参数的情况下调用构造函数,在这种情况下,int {} 将被传递。子表达式是临时对象的值初始化语法。

【讨论】:

  • 是的。正确指出。这不是我写的作业。
猜你喜欢
  • 2015-11-13
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多