使用或{}作为初始化列表有什么区别

问题描述

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

有人可以向我解释吗?我尝试同时使用两者,但没有发现任何区别。

解决方法

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

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

我找不到区别。

在这种情况下没有区别。

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


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

,

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

#include<iostream>
#include<vector>

int main(){

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

    return 0;
}

希望,这可以帮助您了解不同之处,有关更多信息,您应该检查@Thomas Salik提及的链接。 Link