最近我意识到,在C++ 11我们可以称之为一个委托初始化列表构造像用括号调用构造函数,而不是括号
Foo() : Foo{42} // delegate to Foo(initializer_list<>)
这是语法正确吗?它似乎是,虽然我本来希望在调用函数时总是使用括号,如Foo({42})
。在这两个铛++和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;
}
下面compiles fine的示例代码我深知统一初始化的,就像使用{ }
声明对象,但不知道我们还可以调用构造函数。我们不能通话功能,虽然,以下doesn't compile:
#include <initializer_list>
void f(std::initializer_list<int>){}
int main()
{
f{5}; // compile time error, must use f({5})
}
因此,要总结,我的问题是:被委托的构造函数,允许调用只用花括号中的初始列表构造函数时有特殊规则,像Foo{something}
?
你问最有趣的问题 – AndyG