使用 () 或 {} 作为初始值设定项列表有什么区别

Whats the difference between using () or {} for an initializer list

我在查看构造函数的 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构造时,为什么用不同的括号?第一个使用 {},第二个使用 ()

谁能给我解释一下?我尝试同时使用两者,但没有发现任何区别。

When constructing for b and i, why do they use different brackets?

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

I can't find a difference.

在这种情况下没有区别。

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


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

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

#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。 Link.