我最近注意到 C++0x 中的一个类需要显式的默认构造函数。但是,我没有想出一个可以隐式调用默认构造函数的场景。这似乎是一个毫无意义的说明符。我想也许它会Class c;
不赞成,Class c = Class();
但情况似乎并非如此。
来自 C++0x FCD 的一些相关引用,因为我更容易导航[类似的文本存在于 C++03 中,如果不在同一个地方]
12.3.1.3 [class.conv.ctor]
默认构造函数可以是显式构造函数;这样的构造函数将用于执行默认初始化或值初始化 (8.5)。
它继续提供一个显式默认构造函数的示例,但它只是模仿了我上面提供的示例。
8.5.6 [decl.init]
默认初始化 T 类型的对象意味着:
— 如果 T 是(可能是 cv 限定的)类类型(第 9 条),则调用 T 的默认构造函数(如果 T 没有可访问的默认构造函数,则初始化是非良构的);
8.5.7 [decl.init]
对 T 类型的对象进行值初始化意味着:
— 如果 T 是具有用户提供的构造函数(12.1)的(可能是 cv 限定的)类类型(第 9 条),则调用 T 的默认构造函数(如果 T 没有可访问的默认构造函数,则初始化是非良构的);
在这两种情况下,标准都要求调用默认构造函数。但是,如果默认构造函数是非显式的,就会发生这种情况。为了完整起见:
8.5.11 [decl.init]
如果没有为对象指定初始化器,则该对象是默认初始化的;
据我所知,这只会导致没有数据的转换。这没有任何意义。我能想到的最好的方法如下:
void function(Class c);
int main() {
function(); //implicitly convert from no parameter to a single parameter
}
但显然这不是 C++ 处理默认参数的方式。还有什么会使explicit Class();
行为与 不同Class();
?
产生这个问题的具体例子是std::function
[20.8.14.2 func.wrap.func]。它需要几个转换构造函数,其中没有一个被标记为显式,但默认构造函数是。