使用等号操作符或花括号将一个值赋给变量是否有区别?

3
我看到一段代码,其中程序员使用花括号来初始化变量。
int var{ 5 };

不使用赋值运算符

int var = 5;

我知道使用花括号给lhs变量赋值是C++11的语法。使用这两种方法有什么区别吗?
谢谢回复。

5
一个是列表初始化,一个不是。 - Fantastic Mr Fox
2个回答

6

它们是不同类型的初始化:

T a{b};   // list initialization
T a = b;  // copy initialization
T a(b);   // direct initialization

对于int类型,没有区别,但其他类型可能存在区别。例如,如果您的构造函数是explicit,则复制初始化可能会失败,而另外两种方法则会成功。列表初始化不允许缩小转换,但对于另外两种方法,这些是可以接受的。


2
据我所知,对于整数类型而言,这两种语法无区别。然而,{}的语法被设计用来(虽然不仅限于此,因为它也用于initializer_list),以防程序员触发http://en.wikipedia.org/wiki/Most_vexing_parse。因此,初始化v时,您应该写成std::vector<int> v{};而不是std::vector<int> v(){}具有不同的行为取决于使用情况,它可以是构造函数的调用、初始化列表,甚至是按定义顺序初始化用户定义类的成员变量的值的列表。
下面是最后一种用法的例子:
class Q{
public:
    int a;
    int b;
    float f;
};

int main()
{
    Q q{2, 5, 3.25f};
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接