我最近注意到C++ 0x中的一个类需要一个显式的默认构造函数。但是,我无法提出可以隐式调用默认构造函数的方案。这似乎是一个毫无意义的说明符。我以为可能会不允许Class c;改用Class c = Class();,但事实并非如此。
C++ 0x FCD的一些相关引号,因为它使我更容易导航[如果不在同一位置,C++ 03中也存在类似的文本]

它继续提供了一个显式默认构造函数的示例,但是它只是模仿了我上面提供的示例。

在这两种情况下,标准都要求调用默认构造函数。但是,如果默认构造函数不明确,将会发生这种情况。为了完整起见:

据我所知,这仅使转换无数据。这没有意义。我能想到的最好的方法如下:

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]。它需要几个转换构造函数,没有一个被标记为显式,但是默认构造函数是。

最佳答案

这声明了一个显式的默认构造函数:

struct A {
  explicit A(int a1 = 0);
};

A a = 0; /* not allowed */
A b; /* allowed */
A c(0); /* allowed */

如果没有参数,如下面的示例所示,explicit是多余的。
struct A {
  /* explicit is redundant. */
  explicit A();
};

在某些C++ 0x草案(我相信是n3035)中,它在以下方面产生了不同:
A a = {}; /* error! */
A b{}; /* alright */

void function(A a);
void f() { function({}); /* error! */ }

但是在FCD中,它们是changed this(尽管我怀疑他们没有这个特殊的原因),因为这三种情况都对相应对象进行了值初始化。值初始化不会进行重载解析,因此不会在显式构造函数上失败。

关于c++ - 显式默认构造函数的目的,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2836939/

10-11 23:12
查看更多