为什么在构造函数中使用成员初始化来满足显式构造函数的参数是否可以?

rma*_*wal 5 c++ constructor pointers

对于这个令人难以置信的神秘主题,我感到很遗憾.

我一直在阅读Herb Sutter的"More Exceptional C++",我遇到了一个"计数指针"的例子,我不会粘贴整个代码,但他使用带有签名的显式构造函数:

explicit countedPointer(P* obj): p(new impl(obj) ) {}
Run Code Online (Sandbox Code Playgroud)

此外,他声明了一个具有计数的Pointer对象作为类的私有成员的类,在该类的构造函数中,他将其计数指针初始化为:

flagNth(n):pimpl_(new flagNthImpl(n)) {}
Run Code Online (Sandbox Code Playgroud)

其中,pimpl_是计数器指针对象,即

countedPointer<flagNthImpl>pimpl_;
Run Code Online (Sandbox Code Playgroud)

我试图在main.cpp中运行此代码,如果我尝试执行以下操作,则会出现错误(显然,因为构造函数是显式的)

int main(int argc, const char * argv[])
{
    countedPointer<int> cp = new int(5);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么可以在构造函数的成员初始化列表中执行此操作呢?初始化是否与常规初始化有所不同,如果是,如何?

谢谢!

Rei*_*ica 6

这对你有用main:

countedPointer<int> cp(new int(5));
Run Code Online (Sandbox Code Playgroud)

它是直接初始化并且会正常调用构造函数.

但是,你这样做:

countedPointer<int> cp = new int(5);
Run Code Online (Sandbox Code Playgroud)

这是复制初始化,并不适用于显式构造函数.要使用显式构造函数成功使用复制初始化,您需要:

countedPointer<int> cp = countedPointer<int>(new int(5));
Run Code Online (Sandbox Code Playgroud)

当然,使用直接初始化(作为第一个示例)或直接列表初始化通常会更好:

countedPointer<int> cp{new int(5)};
Run Code Online (Sandbox Code Playgroud)