【问题标题】:Whats the difference between using () or {} for an initializer list [duplicate]使用 () 或 {} 作为初始值设定项列表有什么区别[重复]
【发布时间】:2021-02-13 22:57:24
【问题描述】:

我在查看构造函数的 cppreference 时遇到了这个:

class X {
    int a, b, i, j;
public:
    const int& r;
    X(int i)
      : r(a) // initializes X::r to refer to X::a
      , b{i} // initializes X::b to the value of the parameter i
      , i(i) // initializes X::i to the value of the parameter i
      , j(this->i) // initializes X::j to the value of X::i
    { }
};

为 b 和 i 构造时,为什么它们使用不同的括号?第一个使用 {},第二个使用 ()

谁能给我解释一下?我尝试使用两者,但找不到区别。

【问题讨论】:

  • en.cppreference.com/w/cpp/language/initialization {} 可用于值初始化和列表初始化。 () 用于直接初始化。
  • 它们在不同的情况下并不多,而且差异往往是针对每种情况而定的。除了 Thomas 提供的链接之外,还有一个很好的讨论 here。这在初始化容器时特别重要。
  • 一个区别是 {} 将限制“最麻烦的解析”。

标签: c++ initializer-list


【解决方案1】:

在您的示例中没有区别,您可以使用它们中的任何一个,但是在其他一些上下文中存在一些区别,例如,您可以使用花括号来初始化向量,请参见下面的程序。

#include<iostream>
#include<vector>

int main(){

    std::vector<int> first(12,3,5,6);   // Compile time error
    std::vector<int> second{12,3,5,6};  // Ok 

    return 0;
}

希望,这可以帮助您了解差异,有关更多信息,您应该查看@Thomas Salik 提到的链接。 Link.

【讨论】:

    【解决方案2】:

    在构造b和i时,为什么它们使用不同的括号?

    因为写它的人选择这样做。他们为什么选择他们所做的事情,只能由作者来回答。

    我找不到区别。

    在这种情况下没有区别。

    在初始化类类型或涉及隐式转换时可能会有所不同。


    使用引用成员通常是个坏主意。引用成员引用另一个成员可能总是一个坏主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-23
      • 2014-03-16
      • 2011-11-19
      • 1970-01-01
      • 2019-12-24
      • 2016-05-23
      • 1970-01-01
      • 2016-06-27
      相关资源
      最近更新 更多