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

  • 本文关键字:区别 列表 c++ 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构造时,为什么它们使用不同的括号?第一个使用{},第二个使用((

有人能向我解释一下吗?我试着两者都用了,但找不到区别。

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

#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提到的链接。链接

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

因为无论是谁写的,都选择了这样做。他们为什么选择自己所做的,只能由作者来回答。

我找不到区别。

在这种情况下没有区别。

初始化类类型或涉及隐式转换时可能存在差异。


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

最新更新