我最近意识到,在 C++11 中,我们可以调用委托初始化器列表构造函数,例如
Foo() : Foo{42} // delegate to Foo(initializer_list<>)
这个语法正确吗?似乎是,虽然我本来希望在调用函数时总是使用括号,比如Foo({42})
. 下面的示例代码在 clang++ 和 g++ 中都能正常编译
#include <iostream>
#include <initializer_list>
struct Foo
{
Foo() : Foo{42} // I would have expected invalid syntax, use Foo({42})
{
std::cout << "Foo()... delegating constructor\n";
}
Foo(std::initializer_list<int>)
{
std::cout << "Foo(initializer_list)\n";
}
};
int main()
{
Foo foo;
}
我很清楚统一初始化,比如使用声明对象{ }
,但不知道我们也可以调用构造函数。但是我们不能调用函数,下面的代码不能编译:
#include <initializer_list>
void f(std::initializer_list<int>){}
int main()
{
f{5}; // compile time error, must use f({5})
}
所以,总而言之,我的问题如下:委派构造函数时是否有特殊规则,允许仅使用大括号调用 init-list 构造函数,例如Foo{something}
?