最近我意識到,在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