我看到一段代码,其中程序员使用花括号来初始化变量。
我知道使用花括号给lhs变量赋值是C++11的语法。使用这两种方法有什么区别吗?
谢谢回复。
int var{ 5 };
不使用赋值运算符
int var = 5;
我知道使用花括号给lhs变量赋值是C++11的语法。使用这两种方法有什么区别吗?
谢谢回复。
int var{ 5 };
不使用赋值运算符
int var = 5;
它们是不同类型的初始化:
T a{b}; // list initialization
T a = b; // copy initialization
T a(b); // direct initialization
对于int
类型,没有区别,但其他类型可能存在区别。例如,如果您的构造函数是explicit
,则复制初始化可能会失败,而另外两种方法则会成功。列表初始化不允许缩小转换,但对于另外两种方法,这些是可以接受的。
{}
的语法被设计用来(虽然不仅限于此,因为它也用于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};
}