这两种语法在大多数情况下是等价的,选择哪种语法主要取决于个人口味。如果您喜欢统一初始化,我建议使用以下方式:
A a{ A{} };
A a((A())); // This can't be parsed as a function declaration
请注意,有一种情况(非常不可能,我必须说)在这种情况下你问题中显示的这两种形式并不等价。如果你的类 A
有一个接受 initializer_list<A>
的构造函数,那么当使用大括号时,该构造函数将优先于复制构造函数:
#include <initializer_list>
#include <iostream>
struct A
{
A() { }
A(std::initializer_list<A> l) { std::cout << "init-list" << std::endl; }
A(A const& a) { std::cout << "copy-ctor" << std::endl; }
};
int main()
{
A a(A{}); // Prints "copy-ctor" (or nothing, if copy elision is performed)
A b{A()}; // Prints "init-list"
}
A a{ A() };
将优先使用std::initializer_list
构造函数(如果存在),而A a( A{} );
将首选移动/复制构造函数。std::initializer_list
构造函数不可能。#include <iostream>
#include <initializer_list>
struct A {
A() {
std::cout << "A()\n";
}
A(A&&) {
std::cout << "A(A&&)\n";
}
A(std::initializer_list<A>) {
std::cout << "A(std::initializer_list<A>)\n";
}
};
int main()
{
{A a{ A() };} // Prints "A()\n" "A(std::initializer_list<A>)\n"
{A a( A{} );} // Prints "A()\n" and *possibly*
// (depending on copy elision) "A(A&&)\n"
}
A a;
,对吗?如果我没有误解,你建议的语法只有在你想传递给A
构造函数的临时对象类型与A
不同时才有意义,对吗?也就是说,A a { B() };
。 - jogojapan