【发布时间】:2015-06-29 09:10:45
【问题描述】:
我最近意识到,在 C++11 中,我们可以调用委托初始化器列表构造函数,例如
Foo() : Foo{42} // delegate to Foo(initializer_list<>)
这个语法正确吗?似乎是,虽然我希望在调用函数时总是使用括号,比如Foo({42})。在clang++和g++中compiles fine下面的示例代码
#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;
}
我很了解统一初始化,例如使用{ } 声明对象,但不知道我们也可以调用构造函数。但我们不能调用函数,如下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}?
【问题讨论】:
-
你问的最有趣的问题
标签: c++ c++11 constructor initializer-list delegating-constructor