相关疑难解决方法(0)

2753
推荐指数
11
解决办法
81万
查看次数

显式默认构造函数的用途

我最近注意到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
}
Run Code Online (Sandbox Code Playgroud)

但显然这不是C++处理默认参数的方式.还有什么会使explicit Class();行为与众不同Class();

生成此问题的具体示例是std::function[20.8.14.2 func.wrap.func].它需要几个转换构造函数,其中没有一个被标记为显式,但默认构造函数是.

c++ explicit explicit-constructor default-constructor

36
推荐指数
2
解决办法
1万
查看次数